by:zwell

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

    什么叫“不存在资源ID”呢?举个例子,假设url为http://www.baidu.com/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://www.baidu.com/news.php?id=9999999肯定是不存在资源,那么http://www.baidu.com/news.php?id=9999999 or 1=1可以不可以呢?http://www.baidu.com/news.php?id=9999999' or '1'='1可不可以呢?明白了吧?通过or 1=1的方式让数据库返回默认排序的第一条记录。这样的话http://www.baidu.com/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的内容当成正确页面,提取出来伪造的关键字,这个就看工具的算法了。

    完了吗?没呢,最后还差一步,如果在报错模式下,你只能一个字节一个字节的猜(我认识一些知道改技术的朋友都卡在这里了),系统会爆一大片错误,这样的union select模式就无效了。最后一步改进:在--注释后面加一个加号‘+’,嘿嘿,为什么?自己慢慢琢磨吧,当做课后习题。……