php strlen ctf,PHP代码审计——EASY CTF篇

0x01 extract变量覆盖

$flag='xxx';

extract($_GET);

if(isset($shiyan))

{

$content=trim(file_get_contents($flag));

if($shiyan==$content)

{

echo'ctf{xxx}';

}

else

{

echo'Oh.no';

}

}

?>

?shiyan=&flag=1

在file_get_contents($flag)过程时出错,返回$content为空,通过$shiyan==$content判断

42062122d3b4

0x02 绕过过滤的空白字符

$info = "";

$req = [];

$flag="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

ini_set("display_error", false); //为一个配置选项设置值

error_reporting(0); //关闭所有PHP错误报告

if(!isset($_GET['number'])){

header("hint:26966dc52e85af40f59b4fe73d8c323a.txt"); //HTTP头显示hint 26966dc52e85af40f59b4fe73d8c323a.txt

die("have a fun!!"); //die — 等同于 exit()

}

foreach([$_GET, $_POST] as $global_var) { //foreach 语法结构提供了遍历数组的简单方式

foreach($global_var as $key => $value) {

$value = trim($value); //trim — 去除字符串首尾处的空白字符(或者其他字符)

is_string($value) && $req[$key] = addslashes($value); // is_string — 检测变量是否是字符串,addslashes — 使用反斜线引用字符串

}

}

function is_palindrome_number($number) {

$number = strval($number); //strval — 获取变量的字符串值

$i = 0;

$j = strlen($number) - 1; //strlen — 获取字符串长度

while($i < $j) {

if($number[$i] !== $number[$j]) {

return false;

}

$i++;

$j--;

}

return true;

}

if(is_numeric($_REQUEST['number'])) //is_numeric — 检测变量是否为数字或数字字符串 ,此处要求number非纯数字

{

$info="sorry, you cann't input a number!";

}

elseif($req['number']!=strval(intval($req['number']))) //intval — 获取变量的整数值,此处要求number与intval(number)的字符串值一致,而%0c在这一过程中将保留

{

$info = "number must be equal to it's integer!! ";

}

else

{

$value1 = intval($req["number"]);

$value2 = intval(strrev($req["number"]));

if($value1!=$value2){//此处要求number变量数字部分与其反转后相同

$info="no, this is not a palindrome number!";

}

else

{

if(is_palindrome_number($req["number"])){

$info = "nice! {$value1} is a palindrome number!";

}

else

{

$info=$flag;

}

}

}

echo $info;

?number=%00%0c191

%00使if(is_numeric($_REQUEST['number'])) 和elseif($req['number']!=strval(intval($req['number'])))均返回false;

intval和is_numeric都会忽略\f(也就是%0c)这个字符,使number值为191;

而在if(is_palindrome_number($req["number"]))判断中,strval($number)值为\f191,从而使$number[$i]为\f, $number[$j]为1通过if($number[$i] !== $number[$j]) 的判断返回false。

42062122d3b4

42062122d3b4

0x03 多重加密

include 'common.php';

$requset = array_merge($_GET, $_POST, $_SESSION, $_COOKIE);

//把一个或多个数组合并为一个数组

class db

{

public $where;

function __wakeup()

{

if(!empty($this->where))

{

$this->select($this->where);

}

}

function select($where)

{

$sql = mysql_query('select * from user where '.$where);

//函数执行一条 MySQL 查询。

return @mysql_fetch_array($sql);

//从结果集中取得一行作为关联数组,或数字数组,或二者兼有返回根据从结果集取得的行生成的数组,如果没有更多行则返回 false

}

}

if(isset($requset['token']))

//测试变量是否已经配置。若变量已存在则返回 true 值。其它情形返回 false 值。

{

$login = unserialize(gzuncompress(base64_decode($requset['token'])));

//gzuncompress:进行字符串压缩

//unserialize: 将已序列化的字符串还原回 PHP 的值

$db = new db();

$row = $db->select('user=\''.mysql_real_escape_string($login['user']).'\'');

//mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。

if($login['user'] === 'ichunqiu')

{

echo $flag;

}else if($row['pass'] !== $login['pass']){

echo 'unserialize injection!!';

}else{

echo "(╯‵□′)╯︵┴─┴ ";

}

}else{

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值