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}

相关推荐
NuyoahC16 分钟前
算法笔记(十一)——优先级队列(堆)
c++·笔记·算法·优先级队列
这可就有点麻烦了1 小时前
强化学习笔记之【TD3算法】
linux·笔记·算法·机器学习
Ljubim.te3 小时前
软件设计师——数据结构
数据结构·笔记
蜡笔小新星4 小时前
Python Kivy库学习路线
开发语言·网络·经验分享·python·学习
speop5 小时前
【笔记】I/O总结王道强化视频笔记
笔记·音视频
墨@#≯5 小时前
机器学习系列篇章0 --- 人工智能&机器学习相关概念梳理
人工智能·经验分享·机器学习
yngsqq5 小时前
031集——文本文件按空格分行——C#学习笔记
笔记·学习·c#
sealaugh326 小时前
aws(学习笔记第一课) AWS CLI,创建ec2 server以及drawio进行aws画图
笔记·学习·aws
CXDNW6 小时前
【网络篇】计算机网络——应用层详述(笔记)
服务器·笔记·计算机网络·http·web·cdn·dns
向上的车轮6 小时前
Django学习笔记五:templates使用详解
笔记·学习·django