XCTF - easyphp

本题知识点汇总

本题的知识点相对来说比较简单
总结来说题目结构分为两部分

  • 第一部分是对a、b变量进行获取知识点主要有

    • php弱类型比较
    • md5爆破
  • 第二部分为变量c的获取,知识点
    • json_decode函数使用方法
    • is_numeric函数使用方法
    • php数组相关知识
    • php弱类型比较

对php功底比较深的大神来说,本题就很简单了

原题截图

php代码解析

读题,打开网页后发现为比较简单的php代码审计问题,简单分析下代码如下

<?php
highlight_file(__FILE__);
$key1 = 0;
$key2 = 0;
//获取get型变量、ab
$a = $_GET['a'];
$b = $_GET['b'];
//对a、b的数值做了限制a>600万并且a的长度小于等于3
if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){//b的md5切片值为8b184bif(isset($b) && '8b184b' === substr(md5($b),-6,6)){$key1 = 1;}else{die("Emmm...再想想");}}else{die("Emmm...");
}
//json_decode是php5.2.0之后新增的一个PHP内置函数,其作用是对JSON格式的字符串进行编码,
//json_decode接受一个JSON格式的字符串并且把它转换为PHP变量 ,当该参数$assoc为TRUE时,将返回array,否则返回object。
$c=(array)json_decode(@$_GET['c']);
//is_numeric — 检测变量是否为数字或数字字符串
//{'m':xx,'n':{[],xx}}
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){//DGGJ是否存在于$c["n"]中$d = array_search("DGGJ", $c["n"]);$d === false?die("no..."):NULL;遍历数组,如果存在字符串DGGJ则出现报错foreach($c["n"] as $key=>$val){$val==="DGGJ"?die("no......"):NULL;}$key2 = 1;}else{die("no hack");}
}else{die("no");
}
//如果$key1 && $key2都成立,输出flag
if($key1 && $key2){include "Hgfks.php";echo "You're right"."\n";echo $flag;
}?> Emmm...

分步解题

a变量获取

if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){if(isset($b) && '8b184b' === substr(md5($b),-6,6)){$key1 = 1;}else{die("Emmm...再想想");}}else{die("Emmm...");
}

isset($a) && intval($a) > 6000000 && strlen($a) <= 3 变量a存在并且满足下面的条件,长度小,内容大,很容易想到科学计数法,解析如下

  • (int)“1e2”==100,在PHP中若像这种格式的字符串转化成数字,PHP会将其视为科学计数法
    通过分析,可以将a用科学技术法表示一个大于6000000的数字 并且长度不能大于三位,直接来个最大的9e9

b变量获取

isset($b) && '8b184b' === substr(md5($b),-6,6)分析可得b变量的md5值后6位是8b184b,没什么巧,直接上脚本爆破

import hashlib
def get_md5(password):#1- 实例化加密对象md5 = hashlib.md5()#2- 进行加密操作md5.update(password.encode('utf-8'))#3- 返回加密后的结果return md5.hexdigest()
for i in range(1,100000):md51=get_md5(str(i))if md51[-6:]=='8b184b':print(i)

爆破得b为53724

c变量的获取

c变量的获取相对比较麻烦,依次分析

c=(array)json_decode(@$_GET['c']);
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){$d = array_search("DGGJ", $c["n"]);$d === false?die("no..."):NULL;foreach($c["n"] as $key=>$val){$val==="DGGJ"?die("no......"):NULL;}$key2 = 1;}else{die("no hack");}
}else{die("no");
}
  • (array)json_decode(@$_GET['c']):变量c为josn格式的字符串

    • json_decode是php5.2.0之后新增的一个PHP内置函数,其作用是对JSON格式的字符串进行编码,json_decode接受一个JSON格式的字符串并且把它转换为PHP变量 ,当该参数$assoc为TRUE时,将返回array,否则返回object。
  • is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022:变量c为数组并且c中的m值不是数字或者字符串,并且值大于2022

    • is_numeric() 函数用于检测变量是否为数字或数字字符串,如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,注意浮点型返回 1,即 TRUE。
  • is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0]):变量c的n值为数组,并且n数组有两个值,并且c变量n值中的第一个值为数组,此时我们可以获取c变量的格式为{‘m’:xx,‘n’:[[xx,xx…],xx]}

  • $d = array_search("DGGJ", $c["n"]);:变量c的n值中查找是否有DGGJ

foreach($c["n"] as $key=>$val){$val==="DGGJ"?die("no......"):NULL;}
  • 遍历n数组中是否有DGGJ,如果有,则返回no…

分析到这里,题目的两个难点出来了

  • m的取值
  • n的取值

m的取值

关于m的取值,可以先看一个知识点。
PHP是一门弱类型语言,当涉及“”判断时,它的表现是有一些奇特的。
例如,“a0”将会得到true,“a==1”将会得到false。

(int)"1234abc"=1234
(int)"abcd"=0
(int)"1a2b3c"=1
(int)"a12b"=0
(int)"000123abc"=123

原理:PHP语言中在涉及“==”判断时,如果运算符两边分别为字符串(不以数字开头的字符串),会将字符串转化为数字0,再进行比较。如果是以数字开头的字符串,那么它将会转化成开头的数字(即第一个字母前的所有数字)。
唯一的例外就是上面我们提到的科学计数法9e9这种会直接被认定为科学计数法
由此,我们可以得出m的值可以为2023a

n的取值

刚开始,通过分析,我以为只需要再n中有DGGJ字符即可,但是后面遍历数组后却又反回了no…,这里我们需要学习另外一个知识点,array_search 的绕过,相当于弱比较,我们直接赋值为 0,即可绕过。
由此可以对n进行赋值,“n”:[[0,2],0]
综上分析,获取payload
?a=9e9&b=53724&c={“m”:“2023a”,“n”:[[0,2],0]}
http://xxx:xx/?a=9e9&b=53724&c={“m”:“2023a”,“n”:[[0,2],0]} ,获得flag

攻防世界web新手-easyphp相关推荐

  1. 攻防世界——web新手题

    攻防世界----web新手题 1. robots 打开题目场景,发现与robots协议有关,上网搜索robots协议的内容: Robots协议(也称为爬虫协议.机器人协议等)的全称是"网络爬 ...

  2. 攻防世界-web新手区wp

    攻防世界-web新手区wp view source robots backup cookie disabled_button weak auth simple php get_post xff_ref ...

  3. 攻防世界web新手练习 -unseping

    攻防世界web新手练习 -unseping 新版攻防世界的这个题目有点给力,从今天开始刷题刷题 本题的知识点很多,总结出来以下几点 php代码审计 php反序列化 命令执行的绕过方式 空格绕过 空环境 ...

  4. 攻防世界——web新手区(全解)

    当前网络安全形式越来越严重,我国也越来越重视,现在国内乃至国际上各个网络攻防大赛层出不穷,但是练习平台却还是很稀缺,可以说目前网上能够练习的平台也就只有几家,大多数的院校它们有自己的练习平台但并不公开 ...

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

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

  6. 攻防世界-Web(新手区)

    前言 暑假前,为了学习Web题,做了攻防世界的新手区的Web题,当时没有总结,现在总结一下. 正文 Web1:view_source 查看源代码,右键不可以用.所以按F12,直接查看源码即可. Web ...

  7. XCTF攻防世界Web新手入门题大全

    XCTF攻防世界Web之WriteUp无图版 (Tips:有图版本,请移步我的资源,自行下载doc文档) 0x00 准备 [内容] 在xctf官网注册账号,即可食用. [目录] 目录 0x01 vie ...

  8. 攻防世界web新手区easyphp题解writeup

    写在前面 最近在学习CTF web相关知识,顺带学习php,在攻防世界平台上做做题.遇到了一道名为easyphp的题目,对我这个新手一点也不easy,于是决定把过程记录下来. 参考了官网上shuita ...

  9. 攻防世界web新手区合集

    攻防世界(xctf)做题合集-get_post- robots-backup-cookie-disabled_button-simple_php-weak_auth-xff_referer-simpl ...

  10. 攻防世界WEB练习 | easyphp

    前言 作者简介:不知名白帽,网络安全学习者. 博客主页:https://blog.csdn.net/m0_63127854?type=blog 攻防世界专栏:https://blog.csdn.net ...

最新文章

  1. 【Deep Learning】深度学习中的函数类型
  2. android勾选控件_Android中CheckBox复选框控件使用方法详解
  3. [蓝桥杯2019初赛]迷宫-bfs+存储路径
  4. matlab guide 将matlab处理过的图片保存
  5. android gridview 滚动条位置,android-gridview单元格视图位置在滚动后发生...
  6. linux 文件大小 自动变化 写,Linux下自动清理超过指定大小文件的方法
  7. redis数据结构-hash
  8. 使用matlab计算并绘制连续信号的傅里叶变换
  9. iOS常用的几种锁详解以及用法
  10. vs code进行c/c++开发
  11. 计算机信息的应用安全中心在哪,通过Windows Defender安全中心“全新启动”功能恢复/刷新电脑...
  12. 淘宝标题优化词根优化方法技巧 什么是淘宝标题词根
  13. 读书笔记-effective STL
  14. Labview字符串转16进制
  15. mac book 华为C8815不能debug
  16. 前端VUE面试题总结
  17. 解决“Could not find @openzeppelin/contracts/token/ERC20/ERC20Detailed.sol“问题
  18. 计算机java工程师证书有哪些,java工程师证书怎么考?考工程师证书需要学什么内容?...
  19. 极限运算法则——“高等数学”
  20. HTML+CSS简单静态页面——安利首页

热门文章

  1. 什么软件能测试显卡功耗,测试方案及测试平台
  2. 测试每秒点击速度的软件,测试点击速度
  3. java swing GUI窗口美化
  4. yii mysql 查询 类型转换_yii2 数据库查询结果字段类型的问题
  5. Linux PCI驱动编写
  6. 为什么电脑会突然蓝屏
  7. 北大成立人工智能研究院,中科院院士黄如担任院长
  8. 网络攻防“三剑客”正式加盟墨者安全 担任首席安全顾问...
  9. eos源码赏析(七):EOS智能合约入门之共识机制初探
  10. 基于堆栈的缓冲区溢出_基于堆栈溢出问题构建搜索引擎