web-php特性

4 篇文章 0 订阅

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

 参考

intval() 函数用于获取变量的整数值

这里主要是这个函数

if(preg_match("/[0-9]/", num)) 用正则表达式匹配输入值 num,如果存在数字,则返回错误信息 "no no no!" 并终止程序。

Intval() //这个函数是类型转换,也就是转为整形  

类型转换点击前往

因此num满足以上即可输出  flag.php

/?num[]=1

web90

进制转换绕过

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() 函数是 PHP 中的一个内置函数,用于将给定的变量转换为整数。它的语法如下:

intval ( mixed $var , int $base = 10 ) : int

其中,第一个参数 $var 是要转换为整数的变量,可以是字符串、浮点数、布尔值等,第二个参数 $base 是可选的,表示要转换的进制数,默认为十进制。

例如:
$num1 = 123.45;
$num2 = "678.90";
$num3 = true;
$num4 = "0x1a";
$num5 = "010";
echo intval($num1); // 输出 123
echo intval($num2); // 输出 678
echo intval($num3); // 输出 1
echo intval($num4, 16); // 输出 26(将 0x1a 转换为十进制)
echo intval($num5, 8); // 输出 8(将 010 转换为八进制)

 主要还是数据类型转换第一个参数 $num 是需要转换的变量,第二个参数 0  转换成十进制,又要包含十进制为4476,那就是绕过这个准换之后的十进制呗

if(intval($num,0)===4476){

将变量num转为整形 

最后,如果变量num既不是字符串"4476",也不能被解析为整数4476,则输出变量num既不是字符串"4476",也不能被解析为整数4476,则输出变量num的整数值。

那就是在上面基础之上payload如下:

/?num=0x117c  ;同理也可以是十进制的4476//后面任意字母都可以,就是满足不等于 4476;  那八进制的4476是。10574这里前面要加一个0也就是010574

在计算机中,通常采用0x前缀来表示一个数值是十六进制数。加0是八进制,这个前缀可以帮助区分不同进制的数值,特别是在像CC++Java等编程语言中,可以避免误解成其他进制。

 

Web91

正则匹配多行绕过%0a

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 作为开头结尾(不区分大小写)

^ 表示匹配字符串的开始位置;php 表示要匹配的字符串是 "php"$ 表示匹配字符串的结束位置;/m 是一个模式修饰符,表示多行匹配;/i 是另一个模式修饰符,表示忽略大小写

也就是每行都进行匹配;URL的换行符是%0a,\n不起换行作用,因为URL编码中斜杠并不是转义字符,\n只是普通的字符串而已。

所以payload :  /?cmd=%0aphp

利用多行匹配  :%0a

详细介绍该漏洞可前往: Apache HTTPD 换行解析漏洞(CVE-2017-15715)与拓展_Firebasky的博客-CSDN博客 

web92 

弱类型比较==

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)

和90差不多,使num=4476 数据类型转换为整型且是十进制的,不难发现与90少了一个等号,php是弱类型的语言;

===表示全等运算符,要求值相等且类型相等。==表示等于运算符,要求值相等(会临时的类型转化,进行若比较,所以===执行起来会比==快。

可以参照上面web90    /?num=0x117c  ;’/?num=010574

 web93

 字母过滤,八进制绕过

和上面类似,不过是过滤了字母,那么数字可以,既是可以用八进制的010574;这里小数也可以用 /?num=4476.666

if ($num == 4476){
    die("no no no!"); }
if (preg_match("/[a-z]/i", $num)){
    die("no no no!");

web94

!strpos

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;

这次是===全等运算符,那么必须是4476喽,字符是行不通了,那就试试小数,但是这句   if(!strpos($num, "0")){ ;意思是该函数用于查找字符串中是否包含某个字符串,也就是$num变量是否包含数字0,满足0不能出现在第一位,如果找不到,返回false,“!“感叹号的意思是取反逻辑,也就是true,变量中不包含0了

/?num= 空格010574 (加上空格)     ;/?num=4476.0  (小数)

web95 

 小数点过滤 ,%09

if (preg_match("/[a-z]|\./i", $num)){

这里多了一个小数点

那可以用  /?num= 010574   等号后面第一个是空格 另外用%09和空格是一样的

还有一种是把空格换成+好也可以。

Web96

伪协议 

经典的伪协议,得到的base解码就行

php://filter

/?u=./flag.php

/?u=/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.'
}
?>

意思是a和B的不等,但是他的md5值相等

payload : a[]=i&b[]=kun

因为数组经过md5函数返回null,两个null强类型相等

php中的md5()函数无法处理数组类型数据,对于数组类型数据返回NULL,当我们传入两个数组时,就会变成两个NULL,也就是NULL==NULL,成功绕过

 

更多md5比较   点击可前往

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值