CTFshow web(php特性97-100)

                                                                        web97


/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 19:36:32
# @link: https://ctfer.com

*/

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

CTFshow web(php特性97-100)_第1张图片

突然想起这些知识点我之前的文章都介绍过,如果想要系统学习:

PHP强相等&弱相等(附带科学计数法)_php 科学计数法-CSDN博客

这里强等于就主流一个绕过数组绕过

POST

a[]=1&b[]=2

                                                                                web98


/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 21:39:27
# @link: https://ctfer.com

*/

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__);

?>

这里其实就是三目运算符的知识点:

格式:

a?b:c(a对的就执行b,反之则执行c)

那就把$_GET?$_GET=&$_POST:'flag';这里随便传个参数啥的对可以,因为GET上传了参数后$_GET=&$_POST就是要执行的,我下面的HTTP_FLAG=flag就变成了POST

然年后HTTP_FLAG=flag就好了,但是这里是POST

                                                                        web99


/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-18 22:36:12
# @link: https://ctfer.com

*/

highlight_file(__FILE__);
$allow = array();
for ($i=36; $i < 0x36d; $i++) { 
    array_push($allow, rand(1,$i));
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
    file_put_contents($_GET['n'], $_POST['content']);
}

?>

array_push这里就是往数组写入的数据的作用,

 file_put_contents这里就是可以往文件里面写东西的标志

解析:

0x36d(877)这里是从36循环到877,每次i都加一,也就是说我从1~36直接生成一个随机数,然后1~37之间生成一个随机数,1~38............直到1~876,有没有发现一个事实,我每次的范围都包含了一个数字的,那就是1

有意思的是,这里的数组会对元素进行一个覆盖, 比如$array[1]=’1’

$array[1]=’2’,比如一开始在1这个位置产生了数据,但是第二次随机数又在1这个地方产生数据后就会进行一个覆盖

所以越是前面的数据越是容易出现数据,出现覆盖对吧

file_put_contents这里就是可以往文件里面写东西的标志,可是我该往哪里写入木马呢?那就是1.php,这里的概率最大!

CTFshow web(php特性97-100)_第2张图片

payload:?n=1.php

POST:content=

 出现下面的标志的时候证明成功写入了,如果一开始是一片白色啥都没有那就不断刷新页面,使得随机数出现在这个页面,因为一切都是随机的,1.php只是保证了出现的概率最大,但是不保证一定可以,随机数充满随机性

CTFshow web(php特性97-100)_第3张图片

接下来因为我把1传进去了,访问1.php页面,然后直接1=system("ls");发现flag踪迹

CTFshow web(php特性97-100)_第4张图片

最后直接把ls改成tac flag36d.php

CTFshow web(php特性97-100)_第5张图片

                                                                       web100


/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-21 22:10:28
# @link: https://ctfer.com

*/

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


?>
这里不会有人$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);被这里骗了吧,以为v2和v3都是要传入数字的,其实不然,v0的赋值级别最高,然后v0是个数字就行,要保证v0是数字只要保证v1传入数字就好了,后面两个管你是不是数字,就算你是false也不影响我后面做题。

   if(preg_match("/\;/", $v3)){这里v3只要匹配到分号就好,那就赋值分号,

//flag in class ctfshow;
$ctfshow = new ctfshow();

   eval("$v2('ctfshow')$v3");

这里已经明说了flag在class ctfshow;而且还new是实例化对象,出题人是真的怕你不懂直接var——dump输出啊,都已经把反序列化给你做好了,都直接送到嘴边了,直接输出结果就能拿到flag了

payload:

?v1=1&v2=var_dump($ctfshow)&v3=;

CTFshow web(php特性97-100)_第6张图片

把格式包裹,然后0x2d换成-就好了

flag_is_ece1ec5b0x2daab30x2d4fdb0x2d922e0x2dc28159b52cb4

真诚希望我的文章能够帮助大家,谢谢支持!

你可能感兴趣的:(php,开发语言,ctfshow,web安全)