LESS-5 报错注入
利用
extractvalue(xml,path)
文档名,路径
11
XML数据的格式:

一般查找是,extractvalue(xml,/book/author)
我们现在要触发一个报错;把报错信息能显示出来;
# &&
extractvalue(xml,concat(‘~’,(sql)))
http://172.25.254.131/sqli/Less-5/?id=1' and extractvalue(1,concat('~',(select database()))) –+

~波浪线也可以写成0x7e
还有一个触发报错注入的函数;updataxml

前面是检索下来的指定文件指定内容;后面那个是替换的新的内容;
但我们只需要让其报错即可;
找到数据库;
Show databases;
Use security
Select * from xml2;

And updataxml(1,concat(“~”,(select database())),3) –+
还有一个是floor;
上下取整

第11关 post请求;
输入用过户名和密码后在上面看不到任何东西;说明是POST
用BURPSUITE去看;

右键放到重放器中,repeater
然后关闭拦截,就可以在重放器中随便去尝试了
参考打开源代码,
看是否能查出来

是可以查到的;
然后把源代码注释起来;
打开bp
![]()
打开页面渲染,查看效果;
直接登录成功了:

我不仅想看admin,我还想查当前使用的数据库,怎么办?
和GET步骤一样;
在burpsuit,输入3,看是否会报错;
![]()
是2列;
再去进行回显位置;2个位置都不用进行判断;
进行联合 注入

发送,查看响应;页面渲染
可以显示正确的内容;
如果不想显示正确内容,
把admin随便改写
之后,因为回显位置;就替换database()
查看security库中有什么表;
![]()
使用社区版;

在重放器试好之后就可以去浏览器改
专业版难用就下社区版;
第20关cookie的SQL注入;

没有显示;
依然使用burpsuite;
![]()
在referer输入内容
不一定局限于最后一行;
其他行也可能触发;

关卡有误,暂停
二次注入:
第一次构造语句可能根本就执行不了;
比如admin’#
可能把单引号,#进行实体化的处理,让他不再是一个SQL语句;
就导致第一次执行就执行不了;因为他会认为你这个是完整的名字;
他有可能把名字把记录存到自己数据库里面;第二次尝试去访问时候,才把这个触发了,这个就是二次注入
是24关;二次注入:

把语句,符号转译成普通字符;
存入了脏数据;
第二次通过某个页面,去访问这个数据的时候,就会导致触发注入;二次注入
先要注册一个新的用户
mysql_real_escape_string()
注册的时候因为有转译符号;拦住了
但,登录的页面把数据拿来就用了,没有进行校验;触发二次注入
宽字节注入:第32关
GET请求
字符型
闭合符:
![]()
明明源码写的是单引号;为什么没有执行
特殊函数有吗;

会把单引号前面加个斜杠,构造出来的;前面的单引号闭合不了,’\\’
不能正常把AND执行,因为单引号,已经被转译到没有特殊含义了
![]()
\\’就没有任何含义了
这样就需要借助宽字节了;\\’
宽字节讲解
十进制转换为16进制

编码


0x5c

后面有个转义字符;转义字符经过URL编码,变成%5C了,GBK是两个字节可以组成一个汉字,汉字就不会影响我后面的闭合符
第32关
进入burpsuite

关闭拦截,打开重放器;
%27
前端看到的是%27
传到后端,后端会把值做处理,%5C%27
进入MYSQL里面会进行URL解码
这样就会导致,你构造了半天的东西;后面 \\’ 没有办法闭合,你的SQL语句就没办法正常执行;
就相当于,你输入一个 1’ –+ ;到了后端之后,变成了 cdcdcd\\’ –+
而你的单引号就没办法闭合人家本身的单引
既然会给我写的单引前面加个 %5c ;我在在输入的时候,在单引号前加一个 %df’
后端会, 1%df%5c%27 and 1=2 –+
这个时候GBK宽字节;强行加了一个字节进去,到后端之后,自动进行解码;解码时候,如果我们本身的解码方式设置的是这种宽字节的解码,JBK,UKF;
GBK会会把%df%5c这两个字节读取一下,读取完之后,能够构成一个汉字,假如构成中;
‘1中’ and 1=2 –+’
因为我真正执行的在后面:and 1=2 –+
虽然多了个中,但是不影响大局,因为我真正要执行的在后面,
%df%5c是什么东西;繁体运

GBK汉字对照表
你不需要去考虑%5C,%5C是转义符,后端直接去加的,你只需要考虑的是,我把%df%27给凑出来;后端接受的时候会给你%27前面加一个%5c
然后会把%5c%27解析成汉字,然后呢,查出来的结果,要看and符有没有执行,
And符号1=2出不来结果了,证明AND生效了,
And2=2出来结果了证明目前是对的;
尝试联合注入Order by 4
?id=1%df’order by 3
?id=-1%df’ Union selectc1,2,3 –+
1,2,(database())
下一步查表,查列,
Users表名的单引,还是双引
1,2,(中’users===>ascii中’)
把users转换成我们对应的ASCII码;再转成16进制,这样的话,一定能表示成字符,最后结果是
select 1, 2, (select group_concat(column_nane) from information_schema.columns where table_name=0x7573657273 and table_schema=database())–+
因为正常用单引号,前面会加斜杠转义了,所以转成ASCII==》转成16进制
group_concat:把结果拼成一行;
解决单引号问题;
前面单引号转成汉字,后面的弄成字符
必须用16进制吗?

117 115 101 114
Select char(114);

select 1, 2, (select group_concat(column_nane) from information_schema.columns where table_name=char(117,115,101,114,115) and table_schema=database())–+
对于编码方式,你的命令最终在哪里执行,要“那种语言”能够识别你这个编码
接下来是SQLMAP的工具:
自动化SQL注入探测的
KALI自带;
Sqlmap -u http://172……….less1/?id=1

Payload:
Payload = 真正实现攻击目的的恶意代码 / 语句 请求里的普通参数是无关内容,真正用来拿数据、破坏数据库的那段恶意语句,就叫 payload。
-u是GET请求
-r 是在一个文件里面去读取;在bp里面,直接把抓到的包给他
把重放器的内容保存

Vim 1.txt
Sqlmap -r 1.txt
1.txt放的是BP包



