[TOC]

一言既出(笔记KEY:intval绕过)

考点:弱类型比较,intval()函数,注释

1
2
3
4
5
6
7
8
9
<?php
highlight_file(__FILE__);
include "flag.php";
if (isset($_GET['num'])){
if ($_GET['num'] == 114514){
assert("intval($_GET[num])==1919810") or die("一言既出,驷马难追!");
echo $flag;
}
}

分析代码,传入num,要使num的值等于114514,经过intval()函数后要等于1919810。因此有两种思路:

1.让num的值同时满足这两个条件。比如可以构造num=114514+1919810-114514,传入时进行url编码。

由于是弱类型比较,提取开头数字就等于114514,满足条件1,而经过intval()函数处理,最后就是intval(1919810)==1919810,而不会执行die();

image-20240726142255179

2.让intval()函数后面的直接不执行(注释掉)。传入num=114514);//。

image-20240726142935055

语句在执行的过程中变为:

assert(“intval(114514);//)==1919810”) or die(“一言既出,驷马难追!”);

部分被注释,不在运行,此时执行 echo $flag;

webshell(经验:空白页面查看页面源代码)

打开网站

image-20240726155020343

分析,大致就是执行cmd语句,但会对cmd语句进行反序列化,使用传入的cmd要进行序列化

image-20240726155216131

发现flag.php,再次修改,因为过滤了flag字母,使用tac f*打开。

image-20240726153456861

找到flag

image-20240726155419560

批注:使用cat f*也可以,但是回显是空白,需要查看页面源代码。