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}

相关推荐
高山有多高9 小时前
【Linux笔记】UpdSocket
linux·运维·笔记
RickyWasYoung9 小时前
二阶魔方底层逻辑分析
笔记
Sammyyyyy10 小时前
结构化决策模型 Jev 实战笔记,3 个原语、4 个限制、5 个落地场景
人工智能·笔记·开发工具·编程语言
东方芷兰10 小时前
Agent 技术摘要 05 —— BP、SaaS、B2B、C2B、B2C
java·笔记·python·语言模型·自然语言处理
Chen—LSN10 小时前
数据结构——拿捏复杂度
java·c语言·开发语言·数据结构·经验分享·笔记·算法
星恒随风11 小时前
Linux开发工具详解(一):软件包管理、Vim、GCC/G++、Makefile与进度条实战
linux·运维·笔记·学习·vim
小小、码农11 小时前
Ubuntu / Linux 软件安装完整笔记
linux·笔记·ubuntu
xzal1211 小时前
Python 列表操作笔记:append / extend / + / pop
笔记·python
维克兜率天11 小时前
【维克】价差交易实战:配对交易的核心参数设置
大数据·笔记·算法·量化
Seraphina3611 小时前
SQL注入(一)
数据库·经验分享·笔记·sql·网络安全