SQL注入估计在大家眼里已经是老生常谈了,好像就那么回事,其实不然,在Pangolin开发过程中,我遇到过太多太多的特例以及继续深入注入的方法。

这里跟大家讲讲关于资源ID不存在情况下的注入方法。

什么叫“不存在资源ID”呢?举个例子,假设url为http://site/news.php?id=9999999,而对应9999999的资源其实是不存在的。这个情况下,使用传统的sql注入工具是没法判断注入点的(当然Pangolin是可以注入滴),更不用说提取数据了。很多情况下,互联网中存在大量的这种漏洞就被测试人员和开发人员漏掉了。



也许您会想问,这种情况应该基本不存在才对?好吧,我列举几个例子:

1、在进行网页爬行时,会发现很多人为没有注意的链接,而对应ID的资源由于某些原因已经被删除了,

只是在页面中未被删除;

2、开发人员将数据进行了一些清理,没有考虑到删除老的脚本文件;

3、开发人员留了一个表单接口(比如输入id查询对应资源),默认没有参数的,这个情况下我们也不知道这种资源id的表现形式如何;这种情况最多见,搜索条件下最常见。

总之,这种情况其实很多的。我见到过N次。



回归主题,为什么这种情况一般的注入工具没法进行判断呢?我们来回顾一下注入工具的正确判断流程:

1、根据HTTP状态吗

2、根据页面长度(这是Pangolin第一个提出来的判断方法)

3、根据关键字,以前都是手工输入,一直到Pangolin首创提供了一个超级强大智能的【自动分析关键字】

技术(目前没有任何工具能够超过这种算法)。

好吧,再看看,在错误资源id的情况下:状态码都是200,页面长度返回都是一致的,无法提取关键字(因为确实没有关键字可提取)。这时,自动化工具就全部停下来,认为没有漏洞了。有没有办法继续注入呢?

其实是可以的,还可以很快速的提取数据,如何做?

1、报错模式,在mssql最常见,mysql也可以,只是知道的人比较少而已。

2、构造假的正确资源ID的方式。

一种方法这里不多做解释了,回头我再单独发文章介绍。这里讲讲第二种方法:

构造假的正确资源ID的方式。有点拗口是不是,呵呵,没关系。开两个例子你就马上明白了。

http://site/news.php?id=9999999肯定是不存在资源,

那么http://site/news.php?id=9999999 or 1=1可以不可以呢?

http://site/news.php?id=9999999′ or ’1′=’1可不可以呢?明白了吧?

通过or 1=1的方式让数据库返回默认排序的第一条记录。这样的话http://site/news.php?id=9999999 or 1=1作为一个整体就是一个正确的资源页面了。

估计很多朋友看到这里就准备走了,哈哈,还没有完呢。你手工应该是可以了,自动化工具还是没有搞定不是,到头来你还是没法快速注入。这里我介绍一下在Pangolin中是如何实现的:

a)再取一次不可能存在的资源ID,如1111.1,注意了,带点的

b)如果a页面返回的内容与之前一致,那么恭喜,你可以确定这是一个不存在的资源页面了

c)在满足b的情况下,分别请求9999999 or 1=1和9999999′ or ’1′=’1,判断一下注入类型

d)关键在这里了,现在我们要将c的内容当成正确页面,提取出来伪造的关键字,这个就看工具的算法了。