利用SQL注入漏洞拖库,从而导致数据泄露。一般的排查方式,可以使用关键字进行搜索,找到可疑的URL尝试进行漏洞复现,通过Web日志来还原攻击路径,从而确定问题根源。

但是攻击者通过SQL注入漏洞到底获取了什么数据?是所有的数据还是只是访问了其中的一张表?

理论上所有的URL参数请求日志都完整的话,只需要重放每一个请求,然后根据请求响应的情况,就可以一步一步还原出被攻击者拖走的数据。为此,我们搭建一个场景来做攻击数据还原。

1.构建SQL注入场景

通过PHP+MySQL构建了一个GET请求的SQL注入点,使用SQL注入自动化工具拖库,在access.log产生访问日志,我们以此作为分析源。

127.0.0.1 -- [04/Apr/2021:19:55:14 +0800] "GET /test.php?
id=1+and+1%3D2+union+select+1%2C2%2Cconcat%280x7177657E%2Cschema_name%2C0x7E717765%29+from+information_schema.schemata HTTP/1.1" 200 329127.0.0.1 - - [04/Apr/2021:19:55:17 +0800] "GET /test.php?id=1++union+select+1%2C2%2Cconcat%280x7177657E%2Ctable_name%2C0x7E717765%29+from+information_schema.tables+where+table_schema%3D%27test%27 HTTP/1.1" 200 219127.0.0.1 - - [04/Apr/2021:19:55:21 +0800] "GET /test.php?id=1++union+select+1%2C2%2Cconcat%280x7177657E%2Ccolumn_name%2C0x7E717765%29+from+information_schema.columns+where+table_name%3D%27admin%27 HTTP/1.1" 200 247

这里有三个请求,依次是union联合查询数据库库名,表名,以及表的列名的请求。

2.简单自动化实现

大致思路:读取access.php文件,获取url_path,拼接成完整的url,重放HTTP请求,匹配请求相应的内容,得到被攻击者拖走的数据。

def sql_log_analysis(path,pattern):
   com = re.complie(pattern,re.I)
   keys = com.findall(unquote(path))
   a = keys[0][0].replace("0x","").decode('hex')
   b = keys[0][2].replace("0x","").deocode('hex')
   reponse = requests.get(url)
   com2 = re.comile(pattern)
   find_list = com2.findall(reponse.content)
      return keys,find_list

以上就是一个简单的自动化实现过程,通过重放攻击请求,反向还原SQL注入的过程,我们可以进一步了解到攻击者到底动了哪些数据库和表,甚至更详细的数据字段。

3.存在问题

事实上,大部分的Web日志只记录了GET请求,而没有办法更详细的记录POST请求,这个Web日志还原攻击的数据带来极大的局限性。另外,不同的SQL 注入。不同的SQL注入工具,所构造的SQL语句变化也很多,这会大大加大实现难度。
基于以上,这种场景,可能更适合小范围内特定的攻击者请求日志,可以编写脚本重放攻击,还原SQL注入攻击过程,获悉被拖走的数据。

最后修改:2022 年 03 月 16 日 11 : 05 PM
如果觉得这篇文章不错,不妨赏我碎银几两。