攻防世界warmup新人小白详细解题过程

思路:查看网页源码发现提示信息,/source.php
进行代码审计 ,主要函数找出,PHP函数记住,自己构造PAYLOAD
声明:菜菜级的水平,解析有错的不喜轻喷,真的是初级小白,有解析错的欢迎指正~

代码审计

本菜鸟打开后表示很绝望,一大段代码,这个时候不要急于一个个分析语句抠自己不会的PHP函数(我觉着函数是要背的要熟悉的,但掌握整体框架代码思路更重要);首先定位主要的函数语句,噔噔噔,就是下面的这几句,这样看压力就小很多了吧。
前面的函数在做什么呢,在定义一个类,然后定义了主函数中调用的checkFile()函数,先不管它,我们先看主函数。

if (! empty($_REQUEST['file'])     #如果通过request方式得来的FILE参数中的值非空&& is_string($_REQUEST['file'])    #并且呢这个file的值还是一个字符串&& emmm::checkFile($_REQUEST['file'])    #并且的并且还要确保满足checkFile()这个自定义的 函数,怎么才叫满足呢,真&真&真,才能够继续走下去这个代码吧,那checkFile()也要为真,我们瞄一眼那个自定义函数,他真的就是返回的不是TRUE就是FALS巧了这不是
) {include $_REQUEST['file'];     #如果上面的都满足那么就执行这个语句,熟不熟悉啊,Include的!重点观察对象他会把接收到的语句按php语句执行,妙啊妙啊exit;
} else {echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";  #不满足三个真的条件那就跳转到这个笑脸页面了
}

所以很清楚了,有三个判断条件要满足,
(1)'file’不为空,!empty(REQUEST[′file′]才会返回true;(2)_REQUEST['file']才会返回true; (2)R​EQUEST[′file′]才会返回true;(2)_REQUEST[‘file’]是字符串,is_string(REQUEST[′file′]才会返回true;(3)checkFile(_REQUEST['file']才会返回true; (3)checkFile(R​EQUEST[′file′]才会返回true;(3)checkFile(_REQUEST[‘file’]返回true,emmm::checkFile($_REQUEST[‘file’]才
会返回true;

满足1,2就是酱紫,
http://111.200.241.244:52429/source.php?file=aaa

那还要满足3对吧

来!首先假设我们小白已经熟悉掌握了这些函数了,

in_array($page, $whitelist):in_array函数是检查数组中是否存在某个值(找到true;找不false),特别注意这是在数组的键值中找,不包括键 ;翻译:while 这个数组中有没有某个键的值是Page对应的值呢?

<?phpclass emmm   定义了一个类{public static function checkFile(&$page) 我们的自定义函数开始了,这里的page变量从哪里来的呢,其实就是对应主函数里的file的值,这两参数呆的是一个坑{$whitelist = ["source"=>"source.php","hint"=>"hint.php"]; 定义了白名单,白名单是个数组,里面有两组建,每个建对应的值if (! isset($page) || !is_string($page)) {  如果你的page有值或是字符串那么久可以往下执行echo "you can't see it";return false;}if (in_array($page, $whitelist)) { 接刚才的,就可以执行这个比较,while 这个数组中有没有某个键的值是Page对应的值呢?有就true啦return true;}

我们不是就为了构造三个真,来利用Include函数么,那现在让他返回真,怎么返回真,你page传递的数值,要在白名单里面,也就是只能是source.php;hint.php;好的吧,假设
http://111.200.241.244:52429/source.php?file=source.php

结果呢?include(file)
file=page=sourc.php
好家伙,把php又展示了一遍,

死循环不是?!

注意到有个hint.php.人见人爱的hint,进入发现说

flag not here, and flag in ffffllllaaaagggg

那现在就是include文件包含,包含哪个东东呢,包含带ffffllllaaaagggg的东东。问题来了我们并不能确定这个文件的具体位置,
但!!!我们可以通过找到它的相对位置来访问它。即构造…/来完成!!!
那我这样吧:
http://111.200.241.244:52429/source.php?file=…/ffffllllaaaagggg
你们说可以么?把他仍会自定义函数,我们来梳理一下

首先假设我们熟悉mb_substr()函数:返回字符串的一部分。
mb_strpos():返回要查找的字符串在别一个字符串中首次出现的位置
mb_strpos (haystack ,needle )
haystack:要被检查的字符串。
needle:要搜索的字符串

<?phpclass emmm{public static function checkFile(&$page){$whitelist = ["source"=>"source.php","hint"=>"hint.php"];if (! isset($page) || !is_string($page)) { 不是空,且是字符串ok可以进入下一环节echo "you can't see it";return false;}if (in_array($page, $whitelist)) {诶?我的payload没哟白白名单的内容,这时候直接就执行下面的return true;}$_page = mb_substr(到这里了,返回page字符串的一部分,哪一部分呢?从0到strpos指定的字段,赋值给新的page;$page,0,mb_strpos($page . '?', '?') #先给旧的payload用.安了个尾巴?又以尾巴我截断位置,截断处的序号返给substr函数了,也就是截断了);if (in_array($_page, $whitelist)) {  截断后还是那段payload,还是没有白名单的关键词,依然不返回真return true;}$_page = urldecode($page);  url解码$_page = mb_substr( 虚情假意的加个假尾巴?又以假尾巴截断,还会原来的payload$_page,0,mb_strpos($_page . '?', '?'));if (in_array($_page, $whitelist)) { 再次循环return true;}echo "you can't see it";  这个时候发现因为没有白名单 的关基词,几次都无法离开这个死亡循环,一直掉落到了这里,返回了falsereturn false;}}


所以想返回真,必须要有source.php;或者hint.php,而且为了可以的flag文件还要有…/ffffllllaaaagggg
那我这样呢?

http://111.200.241.244:56269/source.php?file=source.php…/ffffllllaaaagggg

依然是猥琐笑脸和你看不到的提示,说明还是返回的false

再走一遍程序看看:


```php
<?phpclass emmm{public static function checkFile(&$page){$whitelist = ["source"=>"source.php","hint"=>"hint.php"];if (! isset($page) || !is_string($page)) { 轻松绕过执行下面的echo "you can't see it";return false;}if (in_array($page, $whitelist)) {有吗? 没有page是source.php../ffffllllaaaagggg;不是source.php,所以不返回真return true;}$_page = mb_substr(   这里即使加了尾巴变成source.php../ffffllllaaaagggg?按尾巴截断,还是source.php../ffffllllaaaagggg,死循环了,$page,0,mb_strpos($page . '?', '?'));

所以,上面的分析看出来我们要有source.php没错,…/ffffllllaaaagggg也没错, 但是想返回真,必须满足
$_page=source.php
文件执行呢又需要Include(source.php…/ffffllllaaaagggg)
文件执行的是file
在被自定义改造前file=page的
嗯,,,,,
改造后就不一定了吧
对吧
Include我们带source.php…/ffffllllaaaagggg
判断真假的Page我们只带source.php玩
如何实现呢?
利用有一刀剪短的mb_substr函数

新的page从source.php…/ffffllllaaaagggg里面剪出source.php让判断为真?
而执行真真真后的Include函数执行的是file对应的(source.php…/ffffllllaaaagggg)

怎么剪短呢?下刀在哪里是通过一个函数自主决定的那就是mb_strpos

mb_strpos通过什么信号决定要一刀咔嚓

是“?”号

好的

那就

source.php?…/ffffllllaaaagggg

懂?

mb_strpos识别出?(我手动加的第一个出现的问号,代码里加的?不是第一个了,不理了就)从这里把下刀序号告诉mb_substr;由mb_substr函数亲自出马一刀下去page=source.php

就是白名单里的值了,OK返回true

主函数三个真了执行include(file)

file在自定义函数外还是source.php?…/ffffllllaaaagggg

实现了包含include(source.php?…/ffffllllaaaagggg)

可是

执行后空白???!!

如果假的话,失手了?可是案例出现的结果,不是猥琐的笑脸,就是flag才对,为什么是空白,没有出现猥琐笑脸就说嘛主函数有返回的三个真(不然就会输出you cant see it,附送真真假的猥琐笑脸)主函数执行了文件包含,只是,

没有包含到带flag的目录ffffllllaaaagggg,或者说包含的文件没有内容

可以

那我们多找几级目录
http://111.200.241.244:56269/?file=source.php?../ffffllllaaaagggg
http://111.200.241.244:56269/?file=source.php?../…/ffffllllaaaagggg
http://111.200.241.244:56269/?file=source.php?../…/…/ffffllllaaaagggg
http://111.200.241.244:56269/?file=source.php?../…/…/…/ffffllllaaaagggg
http://111.200.241.244:56269/?file=source.php?../…/…/…/…/ffffllllaaaagggg
终于!

flag{25e7bce6005c4e0c983fb97297ac6e5a}

回过头来总结
1.找主要函数确定目标很重要,include函数的发现
2.hint.php这个小可爱要记得去看看
3.代码审计离不开PHP函数这里大白话记住几个函数:
in_array检查数组中是否存在某个值,值针对键值,返回真假
mb_substr()函数:返回字符串的一部分。白话说她负责切割字符串
mb_strpos():返回要查找的字符串在别一个字符串中首次出现的位置,她负责返回一个定位序号
4.不能确定文件的具体位置,通过找到它的相对位置来访问它…/
以上~

攻防世界warmup新人小白友好向详细解题过程相关推荐

  1. 攻防世界 pwn进阶区----No.012 babyfengshui 解题思路

    攻防世界 pwn进阶区----No.012 babyfengshui 解题思路 1.本题解题思路 1.先期工作 1.运行程序查看基本逻辑 创建用户 展示用户 更新用户 删除用户 到这里就可以猜测这题有 ...

  2. CTF(pwn)攻防世界warmup

    题目描述 这种题很有意思,只给了题目场景地址没有文件,让你盲打,类似于web中的盲注吧; nc连接,给了 目标地址, 思路是:利用栈溢出覆盖,返回这个地址; 具体是溢出多少是不确定的,是P64(),还 ...

  3. 攻防世界-warmup详解

    1.进入题目的场景 只有一个表情,没有其他的信息,因此我们进行查看源码,发现source.php 2.访问source.php可以看的出来是代码审计 因此我们需要对其代码进行了解 <?phphi ...

  4. 攻防世界CTF —— PHP本地文件包含漏洞解题思路

    原题目如下: <?php show_source(__FILE__); echo $_GET['hello']; $page=$_GET['page']; while (strstr($page ...

  5. 第三届长安杯解析(2次修订版)镜像+具体解析+个人详细解题过程,涉及多个模块,我会努力把所有写好,可以做一下题目,提升很明显。

    第一次写的太烂了,看到其他大佬写的我很羞愧,所以努力修订. 长安杯链接: 链接:https://pan.baidu.com/s/1PIJpKRpn5H94_bxbOJIO0w?pwd=ybww 提取码 ...

  6. 攻防世界Web第一天

    攻防世界[Web]第一天 [Web]第一题 解题步骤 总结 [Web]第一题 X老师让小宁同学查看一个网页的源代码,但小宁同学发现鼠标右键好像不管用了. 解题步骤 第一:获取在线场景,进入浏览页面. ...

  7. 攻防世界_Crypto_sherlock

    攻防世界刷题记录Crypto篇 文章目录 攻防世界刷题记录Crypto篇 前言 解题步骤 1.筛选出文中的大写字母 2.借助Python处理字符串 总结 前言 继续高手进阶区题目~sherlock 咦 ...

  8. 攻防世界web新手区(来自小白)*-*

    鄙人是个纯纯的小白,这个博客也是给小白写的,不过大佬们也不会来查这些题的wp吧 拍飞 文章目录 攻防世界WEB新手区(1--11) 第一题view_source 第二题robots 第三题backup ...

  9. [攻防世界 pwn]——warmup

    [攻防世界 pwn]--warmup 题目地址: https://adworld.xctf.org.cn/ 题目: 嘶, 碰过的第一个盲打的题, nc连上之后只有一个地址, 这个地址肯定是个有用的地址 ...

最新文章

  1. 介绍下计算机的一些常识?
  2. 神经网络模型中class的forward函数何时调用_用Keras从零开始6步骤训练神经网络
  3. Unity 游戏开发技巧集锦之创建自发光材质
  4. OVS 各功能调用过程(三十一)
  5. 等重构完这系统,我就辞职
  6. 2021中国互联网大会正式发布阿里云《云采用框架白皮书》
  7. NetBeans安装提示neatbeans cannot find java 1.8 or higher
  8. Python 全栈开发十 socket网络编程
  9. python logging模块的作用及应用场景_Python常用模块功能简介(三)logging
  10. select count(*) from返回的类型_数据分析面试题类型汇总
  11. labview dll 崩溃
  12. apicloud入门学习笔记1:简单介绍
  13. scala Tuple入门到熟悉
  14. 一路风景之川藏线徒步笔记
  15. 15个Rhino Grasshopper技巧【最新】
  16. vue打包app网络错误和空白页问题
  17. 计算机语言 机器码,什么是机器码 机器码封了怎么解决-与非网
  18. linux proftpd mysql_proftpd mysql quota 配置完全指南
  19. 与其被生活逼,不如被自己逼
  20. 《鸟哥Linux私房菜》——第九章、文件与文件系统的压缩与打包

热门文章

  1. 【数据结构】无向图(构造+遍历)
  2. 883.三维形体投影面积
  3. 鸿蒙之境的称号,神都夜行录鸿蒙之境如何玩 鸿蒙之境阵容选择
  4. Ubuntu 配置静态 IP
  5. php 中array方法,php 中的几个数组方法
  6. 趁着快递还能发,赶紧把迪士尼礼盒带回家 | 钛空舱
  7. Thunder-Beta发布-事后诸葛亮会议-2017秋-软件工程第十一次作业
  8. 【23】基于java教师科研项目管理系统
  9. MUR2060AC-ASEMI快恢复二极管MUR2060AC
  10. 水卡解码 ,pn532