第1章:GET型注入检测实战

各位同学好,我是你们的老朋友。今天咱们来聊聊SQLMap最基础、也是最常用的场景——GET型参数注入检测。

说实话,我刚开始做渗透测试那会儿,遇到最多的就是GET型注入。为什么?因为大部分Web应用都把参数直接放在URL里,开发者图省事嘛。你想想看,一个搜索框、一个商品ID、一个文章编号,这些全都在URL上明晃晃地挂着。这不就是给攻击者递刀子吗?

核心要点:GET型注入检测是SQLMap入门的必修课。掌握了这个,后面POST、Cookie、Header那些都是换汤不换药。

1.1 实战场景:一个典型的GET注入点

假设我们遇到这样一个URL:

http://example.com/product.php?id=101

这个id参数,就是我们的目标。我个人习惯先手动测一下,看看有没有异常。比如加个单引号:

http://example.com/product.php?id=101'

如果页面报错,或者返回了奇怪的内容,那基本就稳了。嗯,这里要注意——不是所有报错都代表注入,但至少说明参数没做严格过滤。

1.2 SQLMap基础命令:一把梭

确认有注入点后,就该SQLMap上场了。最基本的命令长这样:

sqlmap -u "http://example.com/product.php?id=101"

就这么简单?对,就这么简单。SQLMap会自动检测id参数是否存在注入漏洞。它会尝试各种注入技术——布尔盲注、时间盲注、报错注入、联合查询,全给你来一遍。

我记得有一次在项目里,客户说他们的系统绝对安全。我当着他的面,就用了这一条命令,三分钟后,数据库名、表名全出来了。那场面,嗯,有点尴尬。

1.3 --batch模式:省心省力

默认情况下,SQLMap会问你一堆问题:

  • 「检测到可能的注入点,要继续吗?」
  • 「使用哪种注入技术?」
  • 「是否跳过特定测试?」

烦不烦?说实话,挺烦的。尤其是做批量检测的时候,一个一个回答能把你逼疯。

这时候--batch参数就派上用场了:

sqlmap -u "http://example.com/product.php?id=101" --batch

加上--batch后,SQLMap会使用默认选项自动回答所有问题。说白了就是「别问我,你自己看着办」。

我的建议:刚开始学习时,先别用--batch。手动回答几次,看看SQLMap每一步在做什么,能帮你理解检测流程。等熟练了再开自动模式。

1.4 --level与--risk:深度与风险的平衡

这两个参数,我当年刚接触时也搞混过。咱们用个表格说清楚:

参数 取值范围 作用 我的建议
--level 1~5(默认1) 控制检测深度。level越高,测试的Payload和注入点越多 日常用2~3,深入测试用5
--risk 1~3(默认1) 控制风险等级。risk越高,使用的Payload越「暴力」 生产环境别超过2

--level详解:

  • level=1:只检测URL参数和POST数据
  • level=2:增加Cookie和User-Agent检测
  • level=3:增加Referer和Host检测
  • level=4~5:全面检测,包括HTTP头中的各种自定义参数

--risk详解:

  • risk=1:使用常规Payload,基本安全
  • risk=2:增加一些可能引起轻微影响的Payload(比如OR-based注入)
  • risk=3:使用高风险的Payload(比如OR 1=1、时间盲注的长延时)

避坑指南:我曾经在一次生产环境测试中,直接用了--level=5 --risk=3。结果呢?数据库负载飙升,差点把客户的生产库搞挂了。从那以后,我给自己定了个规矩:生产环境最多用level=3、risk=2。测试环境随便造,生产环境要温柔。

实际使用中,我一般这样组合:

# 快速检测
sqlmap -u "http://example.com/product.php?id=101" --batch

# 深入检测(推荐)
sqlmap -u "http://example.com/product.php?id=101" --level=3 --risk=2

# 全面检测(仅限测试环境)
sqlmap -u "http://example.com/product.php?id=101" --level=5 --risk=3

1.5 检测结果分析:看懂SQLMap在说什么

跑完命令后,SQLMap会输出一堆信息。很多人一看就懵了。别急,我教你抓重点。

关键输出字段:

  • Parameter: 告诉你哪个参数存在注入(比如id
  • Type: 注入类型(boolean-based blind、time-based blind、error-based、UNION query)
  • Title: 具体的注入技术名称
  • Payload: 成功触发注入的测试数据
  • Vector: 注入向量,用于后续利用

举个例子,输出可能是这样的:

Parameter: id (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: id=101 AND 1=1

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind
    Payload: id=101 AND SLEEP(5)

看到这个,你就知道:

  • id参数存在布尔盲注和时间盲注
  • 数据库很可能是MySQL 5.0以上
  • 可以用SLEEP(5)做时间盲注

小技巧:如果SQLMap检测出多种注入类型,优先用UNION查询或报错注入。为什么?因为它们出数据快。布尔盲注和时间盲注太慢了,尤其是时间盲注,一个字符可能要等好几秒。

1.6 本章知识体系

下面这张图,是我自己整理的GET注入检测流程。你照着这个思路走,基本不会漏掉什么:

GET型SQL注入检测知识体系 目标URL 基础检测:sqlmap -u "URL" --batch 自动模式 --level 检测深度 --risk 风险等级 检测结果分析 注入类型 | Payload | 数据库信息

这张图把整个流程串起来了。你从目标URL出发,先做基础检测,然后根据需求选择是否用--batch、调整--level--risk,最后分析结果。每一步都有它的意义。

1.7 实战小贴士

最后,分享几个我踩过的坑:

  • 别盲目加参数:不是所有场景都需要--level=5。level越高,测试时间越长。一个简单的GET参数,level=3基本就够了。
  • 注意网络延迟:时间盲注依赖网络响应时间。如果目标服务器本身就很慢,时间盲注的误报率会很高。我一般会先ping一下目标,确认延迟正常再开测。
  • 保存日志:--output-dir指定输出目录,方便后续复盘。我习惯每次测试都建一个以日期命名的文件夹。
sqlmap -u "http://example.com/product.php?id=101" --level=3 --risk=2 --output-dir=./logs/2024-01-15

好了,GET型注入检测就讲到这里。内容不多,但都是干货。你把这个练熟了,后面学POST注入、Cookie注入就会轻松很多。


公众号:蓝海资料掘金营,微信deep3321