PortSwigger -sql学习

PortSwigger -sql学习
所有SQL注入检测的本质都是制造正常查询和异常查询之间的差异然后想办法观测到这个差异。报错探测 —— 利用语法错误泄露信息正常情况下你的输入是sqlSELECT * FROM users WHERE username wang;当你输入单引号后SQL变成SELECT * FROM users WHERE username ;数据库解析器看到开头的字符串在遇到第二个时闭合了但后面多了一个孤立的单引号导致字符串没有正确终结SQL语法不完整。数据库引擎报错不同数据库错误信息不同MySQLYou have an error in your SQL syntaxPostgreSQLERROR: unterminated quoted stringOracleORA-01756: quoted string not properly terminatedSQL ServerUnclosed quotation mark关键点这个错误信息如果被Web服务器原样返回给前端你就看到了报错回显。为什么有时看不到报错应用代码可能用了try-catch捕获异常返回一个200状态码的自定义错误页面而不是把数据库原始错误抛出来——这时候报错探测就失效了需要转向下面其他方法布尔盲注 —— 利用真假条件导致页面不同当数据库不返回报错信息但页面在查询结果为真/假时输出不同内容比如显示欢迎回来 vs 账号不存在我们可以通过构造逻辑表达式来问数据库问题通过页面差异拿到答案。核心payload对-- 真条件永远为真 SELECT * FROM users WHERE username admin AND 11 -- -- 假条件永远为假 SELECT * FROM users WHERE username admin AND 12 -- 攻击者利用这种差异逐字符问出数据-- 问数据库名字的第一个字符是不是a admin AND SUBSTRING(database(),1,1) a --如果页面返回欢迎回来 → 答案是a ✅如果返回账号不存在 → 不是a继续试 b,c...时间盲注 —— 利用睡眠函数制造时间差当页面无论真假返回内容都完全一样布尔盲注也失效但数据库仍然逐条执行SQL指令我们可以利用数据库内置的延时函数制造可观测的时间差异-- 如果条件为真等待5秒再返回 admin AND IF(11, SLEEP(5), 0) -- -- 如果条件为假不等待 admin AND IF(12, SLEEP(5), 0) --带外交互OAST—— 利用数据库发起外部网络请求原理当时间盲注也被禁用比如WAF拦截了SLEEP函数或者数据库连接超时限制太短OASTOut-of-Band Application Security Testing是最后的武器。核心思路是让数据库向外发起网络请求你监控这个请求是否到达你控制的服务器。