Sqli-labs学习(六)

Less-17 基于错误的更新查询POST注入

POST-Update Query- Error based - String

上接Sqli-labs5 - Xherlock

前面我们得出结论:可以利用在password处报错型单引号闭合注入,从源码结合密码修改状况来看,只要输入的用户名存在就会返回修改成功的图片如图

image-20220203110725154.png

所以无法使用布尔盲注

当我们输入uname=admin&passwd=a'#&Submit=Submit时,查看数据表可以看到所有的密码全被改变

image-20220203111048456.png

这个与mysql_fetch_array这个函数相关,它负责将所有查询到的结果转换为数组,再进一步操作

image-20220203111336095.png

因为我们使用#注释掉了limit的限制,所以得到的数组是所有用户名,传入update语句中,就会使所有密码发生相同改变

但我们可以到靶场的首页进行恢复数据库

image-20220203111707981.png

补充:show create table xxx 来查看建表时的语句

法一

这里我们使用or+双注入法,利用的是运算符优先级and>or>=,先算的是'a' or ……

uname=admin&passwd=a' or (select count(*),concat(database(),'~',floor(rand(0)*2)) as a from information_schema.tables group by a)#&Submit=Submit

image-20220203120606404.png

提示子查询只能包含一个字段,所以外加派生表

Less5中select查询返回的字段数为3,足够在column_list中将count()和concat()都包含进去,所以用CONCAT子查询更简单

而在Less17中update查询返回的字段数只有1!不足以使count()后接上concat()这样一个查询语句,这时候就只能通过派生表再将上一层子查询包裹起来,通过select 1 from (报错的CONCAT子查询) derived_table_name使注入查询的字段与update查询的字段数相等!

又碰上了一个大坑,在这里加上派生表上始终报这样的错误

image-20220203123436243.png

研究查资料半天,开始觉得和这个and、or有关,弄到最后无意中发现,mysql中字符真假值好像按照假来做的

验证一下猜想,发现是对的

image-20220203123616489.png

用了个if语句,发现输出的是0处的语句,无语,搞了半天,原来只需passwd后面跟个数字

image-20220203123717390.png

image-20220203123752728.png

只要数字开头即可判断为真,但字母开头就假

后面就可以按部就班来

image-20220203133431620.png

image-20220203133956812.png

按照Less-1里的payload稍加修改即可

uname=admin&passwd=1' and (select 1 from (select count(*),concat((select group_concat(column_name) from information_schema.columns where table_name='users'),'~',floor(rand(0)*2)) as a from information_schema.tables group by a) b)#&Submit=Submit
uname=admin&passwd=1' and (select 1 from (select count(*),concat((select concat(username,'~',password) from users limit 0,1),'~',floor(rand(0)*2)) as a from information_schema.tables group by a) b)#&Submit=Submit    # 获取用户名密码需要一个一个来,改limit里的限制

法二

再学一种报错法注入

UPDATEXML (XML_document, XPath_string, new_value);

new_value:用来替换查找到的符合条件的数据

image-20220203154017469.png

xpath语法中 “~” 是非法字符所以可以用 “~” 构造报错 尝试:成功!

image-20220203154156696.png

法三

再来一种报错注入

extractvalue(XML_document,xpath_string)函数,其实和上一种方法一样,都是基于xpath来注入的

uname=admin&passwd=1' and extractvalue(1,concat('~',(select database())))#&Submit=Submit

image-20220203154848307

image-20220203155014062.png

其余

也可利用时间延迟注入,比较麻烦

Less-18 基于错误的用户代理,头部POST型注入

POST-Header Injection-Uagent field——Error based

看源码,已经对账号密码都进行了验证检查格式,所以很难从这俩地方注入

image-20220203161809615.png

我们使用admin的正确账号密码登陆成功后,数据库出现新信息

image-20220203162141594.png

可以想到使用了insert语句,再去查看源码

image-20220203162225813.png

所以这道题想考我们的insert注入和header部分知识,我们尝试从uagent注入(因为好改)

$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";

image-20220203162624156.png

可以看到uagent发生变化

image-20220203162749168.png

注入成功!

image-20220203190927192.png

后面就可以按之前的来做了

Less-19 基于头部的Referer POST报错注入

POST-Header Injection-Referer filed-Error based

先使用正确账号密码登录,回显referer信息,仿照上题可知,本次通过referer注入

image-20220203191219235.png

image-20220203191844673.png

Less-20 基于错误的cookie头部POST注入

POST-Cookie Injections-Uagent filed-error based

可以看到正确登入回显了很多信息,猜测主要和cookie相关,应该可以从cookie处注入

image-20220203192645149.png

查看源码,重点是下面

image-20220203222945771.png

可以利用单引号闭合注入,同时考虑到*是三列

image-20220203223222621.png

接下来就简单了,跟Less-1很相近

最后修改:2022 年 02 月 15 日
如果觉得我的文章对你有用,请随意赞赏