SQL 注入 - 从页面内容中提取数据库数据

信息安全 Web应用程序 渗透测试 sql注入 工具 自动化测试
2021-08-25 03:25:59

我有一个问题,希望有人能帮忙。。

我正在从头开始编写一个 SQL 注入工具(我知道已经有很好的工具,比如 SQL Map,但是这个必须从头开始编写)。

我遇到的问题:

手动执行 SQL 注入以确定表名或列名等使用字符串时,例如:

www.vulnerable site.net/articles.php?id =-1 union select 1,2,group_concat(column_name),4 from information_schema.columns --

或者

www.vulnarable site.net/articles.php?id =-1 union select 1,2,table_name,4 from information_schema.tables --

很容易确定表名/列名,因为您可以简单地查看页面并阅读页面内容中返回的列名。

但是如何以自动化的方式完成呢?

但是,以自动化方式执行此操作要困难得多,因为该工具如何知道执行 sql 注入时返回的页面上的表名/列名是什么?

执行此操作的最可靠方法是什么,以便工具知道要提取页面内容的哪些部分,因为它们是表名/列名?

例如...我可以解析/搜索以逗号分隔的字符串的页面内容,以获取注入输出的表和列名称吗?有没有更好更可靠的方法来做到这一点?

非常感谢您的帮助,非常感谢

2个回答

最简单的方法是使用盲sql注入。你知道你问的问题是对还是错,这取决于查询需要多长时间执行。这也是最灵活的方法,因为无论被利用的 sql 注入类型如何(盲、非盲、选择、插入、更新、删除......),盲 sql 注入漏洞都将起作用。

另一种方法是在暴力破解列数时尝试识别页面上的可见字段。一旦你在页面上找到这个位置,你就可以从这个位置抓取数据(sqlmap 为非盲注做了类似的事情):

www.vulnerable site.net/articles.php?id =-1 union select 'dsjhfsjhfdf'
www.vulnerable site.net/articles.php?id =-1 union select 'dsjhfsjhfdf','sfjufewjfef'
...

这将适用于 MySQL,但某些数据库类型(如 postgresql),联合选择中的列必须是相同类型。所以数据库也必须是蛮力的。

最简单的方法是使用合法输入和注入访问页面并查看差异。如果您知道哪些内容不是结果并且知道预期结果的格式是什么,那么使用正则表达式或其他解析引擎之类的东西来挑选细节并不难。

当然,任何其他可能因页面加载而异的动态元素(例如广告)都可能会出现需要更详细计划的问题。