Code-Audit(代码审计)习题记录6-7

介绍:

自己懒得搭建靶场了,靶场地址是 GitHub - CHYbeta/Code-Audit-Challenges: Code-Audit-Challenges为了方便在公网练习,可以随地访问,本文所有的题目均来源于网站HSCSEC-Code Audit

6、习题6

题目内容如下:

源代码如下:

复制代码
<?php   
  if (isset($_GET['view-source'])) { 
  header('Location: http://challenge1.xa.honyasec.com/index.php'); 
  show_source(__FILE__); 
         exit(); 
    } 
if (isset($_POST["submit"]))   
{ 
  if (isset($_POST['hihi'])) 
  { 
    if (ereg("^[a-zA-Z0-9]+$", $_POST['hihi']) === FALSE) 
    { 
      exit('<script>alert("have fun:)")</script>'); 
    } 
    elseif (strlen($_POST['hihi']) < 11 && $_POST['hihi'] > 999999999) 
    { 
      if (strpos($_POST['hihi'], '#HONG#') !== FALSE) 
      { 
        if (!is_array($_POST['hihi'])) { 
        include("flag.php"); 
        echo "Congratulations! FLAG is : ".$flag; 
        } 
        else 
      { 
        exit('<script>alert("nonono")</script>'); 
      } 
      } 
      else 
      { 
        exit('<script>alert("nonono")</script>'); 
      } 
    } 
    else 
    { 
      exit('<script>alert("sorry")</script>'); 
    } 
  } 
} 
?> 
<a href="?view-source">view-source</a>  
代码分析:

通过代码分析,需要POST提交两个参数一个是submit 一个是hihi并且submit 在前,hihi在后。提交submit 的值无所谓,给一个值就好。

主要是hihi 参数,hihi参数的长度不能大于等于11,而且hihi的值要大于999999999 也就是最小是 1000000000 这样 hihi 的值的长度也就达到10了,所以用科学计数法绕过为 1e9,另外strpos()函数 需要拼接 #HONG# 也就是 1e9#HONG# 但是这样就不能算做数值大于999999999,前面正好有ereg("^[a-zA-Z0-9]+", _POST['hihi'] ,进行正则匹配。但是ereg() 可以用%00 截断绕过。 所以最后构造的paylaod 是

复制代码
POST   #形式提交数据 
submit=1&hihi=1e9%00#HONG#    #data

提交之后,拿到flag ,该网站没有成功,估计靶场没有搭建好,重要的是思路

7、习题7

题目内容如下

源代码如下:

复制代码
<?php 
include "flag.php"; 
$_403 = "Access Denied"; 
$_200 = "Welcome Admin"; 
if ($_SERVER["REQUEST_METHOD"] != "POST") 
	die("BugsBunnyCTF is here :p..."); 
if ( !isset($_POST["flag"]) ) 
	die($_403); 
foreach ($_GET as $key => $value) 
	$$key = $$value; 
foreach ($_POST as $key => $value) 
	$$key = $value; 
if ( $_POST["flag"] !== $flag ) 
	die($_403); 
echo "This is your flag : ". $flag . "\n"; 
die($_200); 
?>

分析代码后发现,如果要拿到flag 必须满足三个if 的条件,1、请求方法必须包含POST请求,2、并且必须提交必须有flag参数,3、POST提交的flag 的值要和$flag相等。

首先根本不知道flag 的值是多少,但是后面有一个die(200); 同时,含有foreach() *函数可以进行变量覆盖,通过die(*200)输出flag 的值。

接着分析,发现了有两个foreach() 函数,所以在echo 函数输出的时候,输出的变量 flag 是被覆盖过的。结合第一个foreach的功能,我们可以在第二个foreach之前先将_200的值覆盖为原flag的值,这样最后die(200) *就会输出相当于die($*flag)

变量覆盖漏洞解释:

通常将可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞。

例如下面的例子

复制代码
<?php 
 
$name='thinking'; 
 
foreach($_GET as $key=>$value) 
    $$key = $value; 
 
var_dump($key); 
var_dump($value); 
var_dump($$key); 
echo $name; 
 
?> 

如果给与参数?name=test 那么 key=name $key=test

最后输出如下

所以本题目,如果借助die(*200)* *输入flag* *需要将flag* *的值赋值给 $*200,同时需要POST 提交一个flag 的值

复制代码
构造如下:
?$_200=flag 
flag=1           #POST

flag{xiaodalsdhasuyytajds}

当然,也可以借助die($_403)输出flag

复制代码
if ( $_POST["flag"] !== $flag ) 
	die($_403);

构造如下

复制代码
?_403=flag&_POST=1   # 利用第一个foreach函数将_403的值覆盖,同时构造满足$_POST["flag"] !== $flag将变量_POST给覆盖,从而初始化第二个foreach函数
 
flag=                #POST方式将$flag的值

flag{xiaodalsdhasuyytajds}

相关推荐
Larry_Yanan9 分钟前
QML学习笔记(四十二)QML的MessageDialog
c++·笔记·qt·学习·ui
能不能别报错38 分钟前
K8s学习笔记(十九) K8s资源限制
笔记·学习·kubernetes
sulikey1 小时前
【Linux权限机制深入理解】为何没有目录写权限仍能修改文件权限?
linux·运维·笔记·ubuntu·centos
十安_数学好题速析1 小时前
倍数关系:最多能选出多少个数
笔记·学习·高考
Hello_Embed2 小时前
STM32 环境监测项目笔记(一):DHT11 温湿度传感器原理与驱动实现
c语言·笔记·stm32·单片机·嵌入式软件
程序员大雄学编程3 小时前
「深度学习笔记4」深度学习优化算法完全指南:从梯度下降到Adam的实战详解
笔记·深度学习·算法·机器学习
新子y3 小时前
【小白笔记】PyTorch 和 Python 基础的这些问题
pytorch·笔记·python
rechol4 小时前
类与对象(中)笔记整理
java·javascript·笔记
新子y4 小时前
【小白笔记】KNN 核心预测函数 _predict_one 的过程
笔记
橘子是码猴子5 小时前
LangExtract:基于LLM的信息抽取框架 学习笔记
笔记·学习