php特性靶场

 

目录

 

做该靶场的一些函数:

   一:highlight_file(__FILE__);

二:preg_match正则匹配

三:intval()函数:

四:strpos函数:

web89:

web90

web91

web92

web93

web94

web95

web96

web97

web98

web100:


做该靶场的一些函数:

   一:highlight_file(__FILE__);

          1:在php中,highlight_file(__FILE__)的作用是以语法高亮的形式去输出当前php文件代码,会把整个页面的内容都显示出来。

           highlight_file这是 PHP 提供的一个函数,用于输出文件的内容,并对 PHP 代码部分进行语法高亮。会直接将输出内容返回到浏览器。

            (__FILE__):它返回当前脚本文件的完整路径和文件名。本文件高亮。

               如果在包含文件中使用,它返回被包含文件的路径。

               如果在主脚本中使用,它返回主脚本的路径。

        2:当我把这串代码给注释掉的时候,整个页面就看不到任何东西了。                  highlight_file(__FILE__) 是唯一负责显示页面内容的部分,高亮文件是用来显示后端处理的源代码的,如果没有这部分的话就看不到php源码了。

        3:highlight_file( $filename, $return )后面那个参数是可以没有的。可以包含其他文件,也可以是本文件。

        后面那个参数是返回值,如果返回值是false那么就会显示文件的内容(没有的时候默认是它),返回值是true,则不会显示页面的内容

二:preg_match正则匹配

        该函数是 PHP 中的一个正则表达式函数,用于执行模式匹配,也就是用正则表达式在字符串中查找是否存在匹配的部分。其返回值是布尔类型。

         int preg_match(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0)

        1:pattern:正则表达式的模式。(满足条件)

                必须以 / 包围(或者其他界定符),可以包含正则表达式修饰符,如 iu

                i和m等修饰符的区别是i是忽略了大小写。m是多行匹配的意思。%0a在url里面是换行的意思。

                让正则表达式的 ^$ 分别匹配行的开头行的结尾,而不仅仅是整个字符串的开头和结尾。

     s (单行模式,也称为 PCRE_DOTALL): 在单行模式下,. 字符匹配任何字符,包括换行符。

    m (多行模式): 在多行模式下,^ 和 $ 分别匹配每行的开始和结束位置,而不仅仅是整个字符串的开始和结束位置。

        2:subject要搜索的目标字符串。  则本身的/就是/\这么表示了

        剩下的都是可选项,上面的是必选项。 

  3: $matches(可选):

             如果提供了这个参数,preg_match() 会将第一个匹配的结果存储在该数组中。

        $matches[0] 保存完整匹配的字符串。

        $matches[1], $matches[2] 等保存第一个、第二个捕获组的内容。

       4:$flags

                提供额外的选项,如 PREG_OFFSET_CAPTURE(返回匹配位置)

        5:$offset(可选):

                开始搜索的位置(默认从字符串的开头)。

if(preg_match("/a/","qwertayuio")){ //匹配字串中是否包含a字符
 if(preg_match("/(abc)/","qwerta bcayuio")){ //匹配字串中是否包含abc字串
 if(preg_match("/[abc]/","qwertbycuiop")){ //匹配字串中是否包含a、b或c字字符  if(preg_match("/[0-9]/","qwertbycuiop")){ //匹配字串中是否包数字
  if(preg_match("/[a-z]/","12345a6789")){ //匹配字串中是否包小写字母
  if(preg_match("/[0-9]{2}/","qwe89rqw9re8qwer",$a)){ //匹配字串中是否包两位的数字
   if(preg_match("/[0-9]{2,}/","qwe12rqw9re8qwer",$arr)){ //匹配字串中是否包至少两位的数字
   if(preg_match("/[0-9]{2,4}/","qwe12567rqw9re8qwer",$arr)){ //匹配字串中是否包至少两位到4位的数字

if (!preg_match("/\;/", $v2))  检查是否含义分号。

很多匹配规制:在php正则表达式_php 正则 [0-9][a-z]-优快云博客php正则表达式_php 正则 [0-9][a-z]-优快云博客

    6: die() 会输出该消息,然后终止脚本的执行。所以在第一关中,die就可以让下面的代码无法执行,从而实现过滤

三:intval()函数:

                int intval( $var, $base )

        $var:需要转换成 integer(整型) 的「变量」

        $base:转换所使用的「进制」

        返回值可以是整数,也可以是一个布尔类型:

          0:失败       或      空array 返回 0

         1:非空array    返回 1

        其他integer值:成功时 返回 $var 的 integer 值。(返回值是一个整数,如果不是整数会尽力转会为整数,如果转换不了整数,那么就返回值就是0)

         1:进制自动转换:

                当第2个参数为空的时候是默认的是十进制,输入什么数字就是什么数字。

                  值为0x是16进制,值为0的时候是八进制。

就是输入的是进制数字,然而输出的是int 的十进制类型的数字。

        2:数组转换:

                        空数组返回值是0,非空数组返回值1

        3:转换小数,返回小数的整数部分。

        4:判断字符串开头是否是数字,是数字就输出数字,是字母就输出布尔值0

        5:取反~~,反2下就是原来的数字。

        6:浮点数精度损失,进行算数运算。

        1)当某个数字被过滤时,可以使用它的 8进制/16进制来绕过;比如过滤10,就用012(八进制)或0xA(十六进制)。
        2)对于弱比较(a==b),可以给a、b两个参数传入空数组,使弱比较为true。
        3)当某个数字被过滤时,可以给它增加小数位来绕过;比如过滤3,就用3.1。
        4)当某个数字被过滤时,可以给它拼接字符串来绕过;比如过滤3,就用3ab。(GET请求的参数会自动拼接单引号)
        5)当某个数字被过滤时,可以两次取反来绕过;比如过滤10,就用~~10。
        6)当某个数字被过滤时,可以使用算数运算符绕过;比如过滤10,就用 5+5。
原文:https://blog.youkuaiyun.com/wangyuxiang946/article/details/131156104

四:strpos函数:

        strpos定义和用法

        strpos() 函数查找字符串在另一字符串中第一次出现的位置(区分大小写)。

        注释:strpos() 函数对大小写敏感。

        stripos() - 查找字符串在另一字符串中第一次出现的位置(不区分大小写)。
        strripos() - 查找字符串在另一字符串中最后一次出现的位置(不区分大小写)。
        strrpos() - 查找字符串在另一字符串中最后一次出现的位置(区分大小写)

。        无i区分,多加r是最后。

        strpos(string,find,start)                           (这几个函数的用法都是一样的,参数一样)

                第一个(必填)规定要查找的字符串。

                第二个(必填)规定查找什么。

                第三个(选填)从哪里开始。相当于索引从0开始。

如果没有找到就返回0。找到位置就返回该

返回找到的位置的索引,如果是在一个长的字符串中找子字符串,就返回该子字符串的第一个位置的索引。

web89:

        

1:正则表达式中,不让含有数字,如果含有数字了,那么就会die,使得整个代码就中断了。所以就不可以用数字了。

2:就考虑用数组绕过,就num变成一个数组就可以。返回布尔值类型为1.

3:只担心数组会不会有元素get传参数?num[]

web90

0指的是八进制数字,让$num=4476的八进制的时候可以绕过前面的4476,也可以满足后面的条件。

web91

多行和单行前面已经介绍了。%0a是url里面的换行符。

cmd=php%0aphp

如果单行匹配的时候,存在第2行有东西的时候,也不满足正则匹配。

多行匹配的时候只要有一行满足条件就可以。只有php这样一个内容。

web92

  intal()这个函数会根据进制进行自动转换,不必在意后面那个参数了。

1:看源码传num为4476的八进制数字就可以了。也可以16进制去绕过。

2:小数取整的方法也可以4476.1.

web93

该源代码过滤了字母就不能用16进制去绕过了。所以八进制,小数点仍然可以在这里使用。


web94

1:这个函数在上面已经介绍过了。!取反就是看它的位置返回布尔值的取反。所以第一个如果是0,返回值为0,取反是1,那么就执行die。所以就要让0出现在不是第一的位置就行,而且要保证后面8进制转换的数字是10574.

2:或者是4476.01等让它找到0返回错误,并且取整之后还是4476.

web95

preg_match("/[a-z]|\./i")

匹配字母或者点 \.是匹配.的意思。就是表明不能使用小数了。

%20在url编码是空格的意思。

%2b在url里面是加号的意思,加一些预制符,让它认为0不在不在下表为0的地方就可以。

加一些在url没有什么实际影响的符号。空格  Tab +  

web96

还是高亮文件,高亮文件包含flag.php文件就可以了,但是上面把php这个文件得过滤掉了,相当于upload-labs靶场,改下大小写,加.加空格等等。

?u=flag.php+

web97

php中===不仅会比较数字是否相同,也会比较数据类型是否相同。

不同的数字(或任何不同的数据)通过 MD5 加密后有可能生成相同的 MD5 值,这种现象被称为哈希碰撞(Hash Collision)。

虽然 MD5 设计初衷是防止碰撞,但它已被破解,存在多种已知的碰撞对。

1:a = 240610708  & b = QNKCDZO

2:在 PHP 中,如果将数组作为参数传递给 md5() 函数,会导致错误,或者返回 NULL(空值)。空值就相等了。这背后的原因与 md5() 函数的设计以及 PHP 的类型处理方式有关。md5只能接受字符串类型的数字。a[]=1 & b[]=4

post传参就用hacker传就可以了,记得&。

web98

php中的三目运算符

1:条件 ? 表达式1 : 表达式2;

$result = $condition ? $value1 : $value2;    条件为真的时候value的值就被赋予给result。

2:$_GET = &$_POST表示将$_GET数组的引用赋值给$_POST数组。

在PHP中,&符号用于获取变量的地址,即获取变量的引用。当你在PHP中使用$_GET = &$_POST时,你实际上是将$_POST数组的引用赋值给了$_GET这意味着$_GET$_POST将指向同一个数组,任何对其中一个数组的修改都会影响到另一个数组。

分析第一行代码:如果你get传参的话,post传参的值会给get。如果你不是get传参的话,就是字符串flag。

1:这样就出现了第一中绕过(高亮文件上面已经介绍过了):让浏览器知道你get传参就行了,不管传上面,传的空都可以。

2:cookie绕过,修改cookie的值自动拼接。

3:修改请求头

web100:

php new函数用于将对象实例化。

new 是一个关键字,用于创建类的实例。

创建对象时会调用类的构造函数。// 定义一个简单的类
// 定义一个简单的类

// 定义一个简单的类
class MyClass {
    public $property;

    public function __construct($value) {
        $this->property = $value;
    }

    public function display() {
        echo "Property: " . $this->property;
    }
}

// 使用 new 关键字创建 MyClass 的实例
$object = new MyClass("Hello, World!");

// 调用对象的方法
$object->display();  // 输出: Property: Hello, World!
  1. 定义类 :首先,我们定义了一个名为 MyClass 的类,它有一个属性 $property 和一个构造函数 __construct构造函数会在创建对象时自动调用,并可以接收参数来初始化对象的属性。(感觉相当于函数的调用)

  2. 创建对象 :使用 new 关键字创建 MyClass 的实例。这会调用 MyClass 的构造函数,将 "Hello, World!" 作为参数传递给构造函数,从而初始化 $property 属性

  3. 调用方法 :通过对象 $object 调用 display 方法,输出 $property 的值。

eval 函数的主要用途是将字符串作为 PHP 代码来执行。

$code = 'echo "Hello, World!";';
eval($code);  // 输出: Hello, World!

在 PHP 中,is_numeric 是一个内置函数,用于检查给定的变量是否为数字或者数字字符串。(整型浮点型,加冒号的数字)

~如果变量是数字或者数字字符串,返回 true

~否则,返回 false
这行代码尝试检查v1、v2 和 $v3 是否都是数字。由于 PHP 中逻辑运算符的优先级,它实际上只检查了 $v1 是否为数字

然后进行拼接php语句就可以了。

使用printf_r也可以

不可以用echo进行拼接,它出现了报错提示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值