记录两道基础php源码审计题

1.题目名称:ereg

下载附件打开发现如下php源码

<?php 
$flag = "flag{flag}";
if (isset ($_GET['password'])) 
{
  if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
  {
    echo '<p>You password must be alphanumeric</p>';
  }
  else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
   {
     if (strpos ($_GET['password'], '*-*') !== FALSE) //strpos — 查找字符串首次出现的位置
      {
      die('Flag: ' . $flag);
      }
      else
      {
        echo('<p>*-* have not been found</p>'); 
       }
      }
     else 
     {
        echo '<p>Invalid password</p>'; 
      }
   } 
?>

大概看了一下,简单来说就是需要我们通过password参数传入一个值,这个值必须是由大小写字母和数字构成的,同时长度必须小于8位,值必须大于9999999,然后还必须包含“*-*”

很明显,需要我们绕过某些函数才能得到flag。一开始我考虑的是正则绕过,利用%00截断然后传入参数,后面试了发现这个思路不行。然后我就想着能不能绕过strlen和strpos。上网查了一下,发现这两个函数有个共同点就是不能处理数组。那就很简单了,直接传个数组就绕过了。然后刚好php是弱类型函数,数组是大于整型的,所以payload为/?password[]=a

2.题目名称:无语子

打开网页发现如下代码

<?php
    include "flag.php";
    $a = @$_REQUEST['hello'];
    eval( "var_dump($a);");
    show_source(__FILE__);
?>

这里我一开始犯抽跑去直接看前端代码了(我也不知道为什么会这样,代码审计一般只需要专注于当前的代码就行了)

后面经过简单的思考,确定是绕过eval函数

技巧大概就是引号截断,就是利用eval函数会把括号内的所有字符串当做php代码来执行的特性进行绕过。

payload就是/?hello=);print_r(file(./flag.php)

这个拼接起来就是eval("var_dump();printf_r(./flag.php));")

posted @ 2022-08-07 22:38  0x1ang==  阅读(94)  评论(0)    收藏  举报