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
先导入一个current_user(作用:当前用户的代理对象。)它的值为 models/user.py 里的字段,如 current_user.username == self.username = username
2、设置权限
仔细审题,flag在/secret,只有admin可以看
,题目的意思是我们只需要能让admin看到flag就行了,别的用户不行,所以在 /admin/console
这个路由加个条件判断,修补方法查看注释即可
3、对别的路由进行过滤
由于题目已经事先给我们准备好了waf,我们看看还有没有别的地方需要过滤(如果不是admin用户)
会发现/process_file
这个路由也可以直接读/secret
文件,将上面的WAF稍作修改替换下即可
4、 打包
#!/bin/bash
mv main.py /app/main.py
chmod 755 /app/main.py
结构如下
例题2 (web)
题目描述:该金融系统开发时引入了不安全的组件,你能找到里面的后门修复漏洞吗?修补的白名单命令['mv', 'cp', 'chmod','rm']
这里需要找到web运行的目录在哪,一般直接 ps -aux
查看当前有哪些进程正在运行
如下图,可以很容易看出来是tomcat正在运行
由此可以找到对应的web目录为 /tomcat/webapps/ROOT
,同样先对其打包操作,然后看看哪里存在漏洞
比如这题,是存在一个 .shell.jsp
木马文件
直接查看该文件得到下图,很明显的木马文件
可以直接用D盾扫,或者用河马查杀工具(如果是线上的话),这题考查的是开发时引入了不安全的组件,所以我们查看tomcat的lib文件,看看最近一次做修改的是哪个文件
最后发现有个依赖是5月份修改的
下载下来拖到jadx反编译看看是不是马
Filter内存马,证据确凿了,利用姿势
修补方法
#!/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
结构
例题3 (web)
题目描述:你能找到文件读取漏洞吗?
老样子,先看一下用啥跑的
发现使用 java -jar 直接跑jar包,然后搜一下文件在哪,这里搜出来路径为 /meeadmin/mee-admin.jar
查看目录会发现有files和logs,我们以files为入口点,猜测文件写入最终是写到这个目录里的
题目给了源代码,直接用idea打开源代码加载工程,记得重载maven
双击shift搜file,同时可以搜一下sql表在哪,本地起一个数据库,方便调试(可选)
搜到一个FileUploadController类
alt+7看看文件结构,有上传就会有下载
定位到当前类的包里,会发现还有一个CommonFileController类
类里边存在一个fileName和filePath
为了测试是否存在任意文件下载漏洞,可以构造一个payload,http://xxx.xxx.xxx.xxx:32201/mee/common/file?fileName=1.txt&filePath=../../../flag
如图,发现下载成功
知道了漏洞点,那防御方式就非常简单了,filePath
过滤掉 ..
和 /
就行
然后重新打包一下
修补包
#!/bin/bash
mv mee-admin.jar /meeadmin/mee-admin.jar
结构
例题4 (pwn)
题目描述:Write memos and memo will help you remember things.
IDA打开反编译一下
一个很明显的格式化字符串漏洞,printf少了格式化字符串
所以修补办法很简单,第一种方法考虑把格式化字符串写入rdi中,在eh_frame段中加入一个%s的格式化字符串,然后在eh_frame上面写一段
lea rdi addr
然后在调用printf函数的时候跳转过来,需要给eh_frame段附上可执行权限 总体来说比较麻烦
第二种方法考虑把格式化字符串换成puts函数
由于这题用的是偏移计算plt函数的方式
首先注意到plt函数距离printf函数0x20的距离
这边的E8的x86汇编表示的是call 79 FC FF FF 表示的偏移的补码形式
我们只需要把0x79-0x20就可以把它变成puts了
但是如果遇到的不是偏移形式的,也就是没开plt.sec保护的情况下 可以直接修改printf为puts
接下来会遇到一个问题 就是puts函数比起printf函数会多打印一个回车也就是/n,但是我们可以看到程序在printf之后又加上了一个 puts。我们可以把上面的printf改成puts,然后再把下面的那个puts给nop掉这样就可以完成修改了
Java防御
使用软件:
-
IDEA Ultimate Edition,社区版的IDEA功能会不全,打起包来会很麻烦(用途:开发,代码审计,打包用)
-
Jadx(用途:反编译工具)
定位漏洞点
一些需要注意的函数
方便代码定位,定位代码快捷键IDEA双击Shift,然后直接搜即可
-
InputStream(文件写入/读取)
-
OutputStream(文件写入/读取)
-
FileInputStream(文件写入/读取)
-
readObject/writeObject(反序列化漏洞)
-
Execute/URLConnection/executeMethod(请求伪造)
打包姿势
如果有源代码
IDEA打开直接加载,重载下Maven,然后数据库该配的配一下,如果懒得配(不调试)直接定位到漏洞点修改文件就行,参考上面的 meeadmin 这题
修改完文件后右边Maven图标点开package按一下就行,然后会在target/*里生成一个jar包或者war包
如果没有源代码
Jadx打开jar或者war包,找到存在漏洞的类,如下图
然后根据Jadx的项目结构新建一个IDEA项目
将反编译后需要修改的代码复制过去(如果有文件依赖也要一起复制)
然后看看有没有lib包,如果有的话在 webappWEB-INF
下新建一个 lib
文件夹,如下图
然后把反编译后的lib里的jar包放进去接着右键IDEA里的lib文件夹创建库即可,打包方式和上面的一样
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
不建议直接用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防御指南(例题及方法)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论