RDG防御指南(例题及方法)

admin 2024年6月21日12:44:32评论9 views字数 6311阅读21分2秒阅读模式

AI生成:这篇文章总结了常见Web服务的关键目录和一些典型的安全问题及其解决方案。例如,通过Flask-Login模块的用户认证,只允许管理员访问敏感文件夹;在发现金融系统中存在后门时,通过识别和删除恶意文件及依赖库来修复漏洞;针对文件读取漏洞,通过输入验证防止路径遍历攻击;对于二进制程序中的格式化字符串漏洞,采用修改汇编指令或函数调用的方式进行修复。文章还涵盖了不同编程语言的防御方法,包括Java、PHP、Python和Node.js,并提供了打包和重启服务的具体脚本。

一些小操作

一些常见的站点目录,有时候能大派用场

  • Nginx目录:/usr/local/nginx

  • MySQL目录:/usr/local/mysql

  • MySQL数据库所在目录:/usr/local/mysql/var 或者 /var/lib/mysql

  • PHP配置文件目录:/usr/local/php 或者 /etc/php/x.x/

  • Nginx 站点默认目录:/var/www/html 或 /usr/local/nginx/html

  • Apache 站点默认目录:/var/www/html 或 /usr/local/apache/

  • Java 目录:

    • 找之前先运行下 ps -aux

    • 一般 /usr/webapp/xxx 或者 /app/xxx

  • 其他语言

    • 看 ps -aux

如果实在不知道建议请教裁判

例题1 (web)

题目描述:flag在/secret,admin可以看,但是别人不行;修补白名单命令:['mv', 'cp', 'chmod'];防御环境会在文件替换后重启服务

具体防御方法如下

1、 了解flask_login模块鉴权过程

给大家推荐一份文档,Flask-Login — Flask-Login 中文 0.4.1 文档 (flask-login-cn.readthedocs.io),可以简单过一遍,我们待会用到的就是文档里边的 autherization

RDG防御指南(例题及方法)

先导入一个current_user(作用:当前用户的代理对象。)它的值为 models/user.py 里的字段,如 current_user.username == self.username = username

RDG防御指南(例题及方法)

2、设置权限

仔细审题,flag在/secret,只有admin可以看,题目的意思是我们只需要能让admin看到flag就行了,别的用户不行,所以在 /admin/console 这个路由加个条件判断,修补方法查看注释即可

RDG防御指南(例题及方法)

3、对别的路由进行过滤

由于题目已经事先给我们准备好了waf,我们看看还有没有别的地方需要过滤(如果不是admin用户)

RDG防御指南(例题及方法)

会发现/process_file这个路由也可以直接读/secret文件,将上面的WAF稍作修改替换下即可

RDG防御指南(例题及方法)

4、 打包

#!/bin/bash
mv main.py /app/main.py
chmod 755 /app/main.py

结构如下

RDG防御指南(例题及方法)

例题2 (web)

题目描述:该金融系统开发时引入了不安全的组件,你能找到里面的后门修复漏洞吗?修补的白名单命令['mv', 'cp', 'chmod','rm']

这里需要找到web运行的目录在哪,一般直接 ps -aux 查看当前有哪些进程正在运行

如下图,可以很容易看出来是tomcat正在运行

RDG防御指南(例题及方法)

由此可以找到对应的web目录为 /tomcat/webapps/ROOT,同样先对其打包操作,然后看看哪里存在漏洞

比如这题,是存在一个 .shell.jsp 木马文件

RDG防御指南(例题及方法)

直接查看该文件得到下图,很明显的木马文件

RDG防御指南(例题及方法)

RDG防御指南(例题及方法)

可以直接用D盾扫,或者用河马查杀工具(如果是线上的话),这题考查的是开发时引入了不安全的组件,所以我们查看tomcat的lib文件,看看最近一次做修改的是哪个文件

最后发现有个依赖是5月份修改的

RDG防御指南(例题及方法)

下载下来拖到jadx反编译看看是不是马

RDG防御指南(例题及方法)

Filter内存马,证据确凿了,利用姿势

RDG防御指南(例题及方法)

修补方法

#!/bin/bash
rm -fr /tomcat/webapps/ROOT/.*.jsp
cp -pa shell.jsp /tomcat/webapps/ROOT/.shell.jsp
cp -pa index.jsp /tomcat/webapps/ROOT/index.jsp
rm -fr /tomcat/webapps/ROOT/*.html
rm -fr /tomcat/lib/tomcat-i18n-bk.jar

结构

RDG防御指南(例题及方法)

例题3 (web)

题目描述:你能找到文件读取漏洞吗?

老样子,先看一下用啥跑的

RDG防御指南(例题及方法)

发现使用 java -jar 直接跑jar包,然后搜一下文件在哪,这里搜出来路径为 /meeadmin/mee-admin.jar

RDG防御指南(例题及方法)

查看目录会发现有files和logs,我们以files为入口点,猜测文件写入最终是写到这个目录里的

RDG防御指南(例题及方法)

题目给了源代码,直接用idea打开源代码加载工程,记得重载maven

RDG防御指南(例题及方法)

双击shift搜file,同时可以搜一下sql表在哪,本地起一个数据库,方便调试(可选)

RDG防御指南(例题及方法)

搜到一个FileUploadController类

RDG防御指南(例题及方法)

alt+7看看文件结构,有上传就会有下载

RDG防御指南(例题及方法)

定位到当前类的包里,会发现还有一个CommonFileController类

RDG防御指南(例题及方法)

类里边存在一个fileName和filePath

RDG防御指南(例题及方法)

为了测试是否存在任意文件下载漏洞,可以构造一个payload,http://xxx.xxx.xxx.xxx:32201/mee/common/file?fileName=1.txt&filePath=../../../flag 如图,发现下载成功

RDG防御指南(例题及方法)

知道了漏洞点,那防御方式就非常简单了,filePath过滤掉 .. 和 / 就行

RDG防御指南(例题及方法)

然后重新打包一下

RDG防御指南(例题及方法)

修补包

#!/bin/bash
mv mee-admin.jar /meeadmin/mee-admin.jar

结构

RDG防御指南(例题及方法)

例题4 (pwn)

题目描述:Write memos and memo will help you remember things.

IDA打开反编译一下

RDG防御指南(例题及方法)

一个很明显的格式化字符串漏洞,printf少了格式化字符串

所以修补办法很简单,第一种方法考虑把格式化字符串写入rdi中,在eh_frame段中加入一个%s的格式化字符串,然后在eh_frame上面写一段

lea rdi addr

然后在调用printf函数的时候跳转过来,需要给eh_frame段附上可执行权限 总体来说比较麻烦

第二种方法考虑把格式化字符串换成puts函数

由于这题用的是偏移计算plt函数的方式

RDG防御指南(例题及方法)

首先注意到plt函数距离printf函数0x20的距离

RDG防御指南(例题及方法)

这边的E8的x86汇编表示的是call 79 FC FF FF 表示的偏移的补码形式

我们只需要把0x79-0x20就可以把它变成puts了

但是如果遇到的不是偏移形式的,也就是没开plt.sec保护的情况下 可以直接修改printf为puts

接下来会遇到一个问题 就是puts函数比起printf函数会多打印一个回车也就是/n,但是我们可以看到程序在printf之后又加上了一个 puts。我们可以把上面的printf改成puts,然后再把下面的那个puts给nop掉这样就可以完成修改了

RDG防御指南(例题及方法)

Java防御

使用软件:

  • IDEA Ultimate Edition,社区版的IDEA功能会不全,打起包来会很麻烦(用途:开发,代码审计,打包用)

  • Jadx(用途:反编译工具)

定位漏洞点

一些需要注意的函数

方便代码定位,定位代码快捷键IDEA双击Shift,然后直接搜即可

  • InputStream(文件写入/读取)

  • OutputStream(文件写入/读取)

  • FileInputStream(文件写入/读取)

  • readObject/writeObject(反序列化漏洞)

  • Execute/URLConnection/executeMethod(请求伪造)

RDG防御指南(例题及方法)

打包姿势

如果有源代码

IDEA打开直接加载,重载下Maven,然后数据库该配的配一下,如果懒得配(不调试)直接定位到漏洞点修改文件就行,参考上面的 meeadmin 这题

RDG防御指南(例题及方法)

修改完文件后右边Maven图标点开package按一下就行,然后会在target/*里生成一个jar包或者war包

RDG防御指南(例题及方法)

如果没有源代码

Jadx打开jar或者war包,找到存在漏洞的类,如下图

RDG防御指南(例题及方法)

然后根据Jadx的项目结构新建一个IDEA项目

RDG防御指南(例题及方法)

将反编译后需要修改的代码复制过去(如果有文件依赖也要一起复制)

然后看看有没有lib包,如果有的话在 webappWEB-INF 下新建一个 lib 文件夹,如下图

RDG防御指南(例题及方法)

然后把反编译后的lib里的jar包放进去接着右键IDEA里的lib文件夹创建库即可,打包方式和上面的一样

RDG防御指南(例题及方法)

Java防御

数组循环过滤

String[] filterList = {"apple", "banana", "cherry"};
String str = "ana"; // 匹配包含"ana"的字符串
for (String s : filterList) {
if (s.contains(str)) {
System.out.println("Hacker!");
// 返回空值
return;
}
}

或者一些字符串常用函数

s.contains("xxx") || s.contains("xxx") || s.contains("xxx") || s.contains("xxx")

关于过滤这块建议下个 https://github.com/Drun1baby/JavaSecFilters

RDG防御指南(例题及方法)

不建议直接用replace替换

PHP防御

function wafrce($str){
return !preg_match("/openlog|syslog|readlink|symlink|popepassthru|stream_socket_server|scandir|assert|pcntl_exec|fwrite|curl|system|eval|assert|flag|passthru|exec|chroot|chgrp|chown|shell_exec|proc_open|proc_get_status|popen|ini_alter|ini_restore/i", $str);
}
function wafsqli($str){
return !preg_match("/select|and|*|x09|x0a|x0b|x0c|x0d|xa0|x00|x26|x7c|or|into|from|where|join|sleexml|extractvalue|+|regex|copy|read|file|create|grand|dir|insert|link|server|drop|=|>|<|;|"|'|^||/i", $str);
}
function wafxss($str){
return !preg_match("/'|http|"|`|cookie|<|>|script/i", $str);
}
if (preg_match('/system|tail|flag|exec|base64/i', $_SERVER['REQUEST_URI'])) {
die('no!');
}

# SQL注入
$pattern = "select|values|tables|insert|update|delete|and|or|'|/*|*|../|./|union|into|load_file|outfile|dumpfile|sub|hex";
# 命令执行和文件读取
$pattern.= "|file_put_contents|fwrite|curl|system|eval|assert";
$pattern.= "|passthru|exec|system|chroot|scandir|chgrp|chown|shell_exec|proc_open|proc_get_status|popen|ini_alter|ini_restore";
$pattern.= "|`|dl|openlog|syslog|readlink|symlink|popepassthru|stream_socket_server|assert|pcntl_exec";

Python防御

数组过滤法

filter_list = ["apple", "banana", "cherry"]
strings = "ana" # 匹配包含"ana"的字符串
for i in filter_list:
if i in strings:
print("Hacker!" )

字符串匹配法

if 'xxx' in arr:
return ''

针对SSTI进行过滤

过滤
{{
}}
{
}
{%
class
'
"
.
_

一些常用的Web框架文档

  • 基础:Django 教程 | 菜鸟教程 (runoob.com)

    • 用户认证:Django中的用户认证 | Django 文档 | Django (djangoproject.com)

  • 基础:欢迎来到 Jinja2 — Jinja2 2.7 documentation (jinkan.org)

  • 基础:欢迎来到 Flask 的世界 — Flask中文文档(2.3.x) (dormousehole.readthedocs.io)

    • 用户认证:第 8 章:用户认证 - Flask 入门教程 (helloflask.com)

Node防御

过滤关键词

const keywords = ["apple", "banana", "cherry"];
for (const i of keywords) {
if (code.includes(i)) {
console.log("Hacker!")
}
}

针对命令执行

  • child_process

  • exec

  • execFile

  • spawn

  • openSync

  • [

  • ]

  • `

  • +

  • Reflect

update.sh命令速查

仅针对update.tar.gz修补包传上去后会异常的情况,如果有些题目原文件(没有做修补的)传上去后显示check检测失败,那么有可能需要我们自己重启服务端

Go语言

#!/bin/bash
kill -9 $(pidof app)
cp 修改后的附件 /app
chmod +x /app
/app 2>&1 >/dev/null &

Python语言

cp /app.py /app/app.py
ps -ef | grep python | grep -v grep | awk '{print $2}' | xargs kill -9
cd /app && nohup python app.py >> /opt/app.log 2>&1 &

PHP语言

#!/bin/bash
cp /index.php /var/www/html/index.php

Nodejs语言

Nodejs语言
#!/bin/sh
cp server.js /app/server.js
ps -ef | grep node | grep -v grep | awk '{print $2}' | xargs kill -9
cd /app && nohup node server.js >> /opt/aa.log 2>&1 &

Java语言

#!/bin/sh
mv -f ROOT.war /opt/tomcat/webapps/ROOT.war
sh /opt/tomcat/bin/shutdown.sh
nohup sh /opt/tomcat/bin/catalina.sh run > myout.txt 2>&1 &

一些文档(只看防御)

  • CISCN西南复赛AWDPlus Web – fushulingのblog

  • 奇安信攻防社区-2022蓝帽杯决赛WriteUp (butian.net)

  • 2023 CISCN 华东北分区赛 Web Writeup - X1r0z Blog (exp10it.cn)

  • 2023 CISCN 总决赛 AWD & 渗透 Writeup - X1r0z Blog (exp10it.cn)

原文始发于微信公众号(Gh0xE9):RDG防御指南(例题及方法)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年6月21日12:44:32
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   RDG防御指南(例题及方法)https://cn-sec.com/archives/2870980.html

发表评论

匿名网友 填写信息