第十八次作业

news/2025/1/6 15:40:31/文章来源:https://www.cnblogs.com/jiajiawei/p/18649951

1、sql注入漏洞中,常见的防护方案有哪些?请简述原理和用法
类型转换:
将输⼊强制转换为整数/浮点 ⽤于整数/浮点类型的输⼊参数处理,可防⽌SQL注⼊。
intval($input)
floatval()
floor()
(int)$input
$input + 0
特殊字符转义:
addslashes 在单引号(')、双引号(")、反斜线(\)与 NULL前加上反斜线可⽤于防⽌SQL注⼊。
magic_quotes_gpc:
当magic_quotes_gpc=On时,如果post、get、cookie过来的数据有单引号(’)、双引号(”)、反斜线(\)与 NUL(NULL 字符)等字符,PHP解析器就会⾃动增加转义字符“\”。如果这个选项为off,那么我们就必须调⽤addslashes这个函数来为字符串增加转义。

2、针对常见的防护方案,哪些是可以绕过的?哪些又没法绕过?
在php中,addshalshes()函数的作⽤是在单引号(')、双引号(")、反斜杠()和NULL前加上反斜杠,这样可以防御⼤部分的恶意SQL注⼊。
SQL语句中传参⽆单引号闭合绕过:
数字型参数往往不需要⽤单引号(')闭合,因为SQL语句没有单引号,故攻击者只需在后⾯加上注⼊语句,addslashes()函数对这些语句是不起作⽤的,这种情况多⻅于数字型参数注⼊,解决的⽅法是先⽤intval()函数进⾏强制转换。
宽字节注⼊绕过:
因为addslashes()函数⾸先在单引号(%27)前⾯加⼀个反斜杠(%5c),在GBK编码中,%df%5c为中⽂“運”,这就导致后⾯的单引号逃掉了。
编码解码导致绕过:
urldecode 编码注⼊,id = urldecode($id) //注⼊语句进⾏两次编码,⾸先通过addslashes()过滤,然后urlencode解码。
base64_decode 编码注⼊,$id = base64_decode($id) //⾸先通过addslashes()过滤,然后urlencode解码.
json_decode 编码注⼊,json_decode具备绕过全局转义以及gpc的特点,也就是会吃掉反斜杠。当我们提交'时会被转义成'⽽这⾥再经过⼀次json_decode则会吃掉反斜杠。
弱类型绕过:
在判断数据类型时,php有类型函数 对其判断,php是⼀种弱类型,会⾃动转换类型。如果只是判断 并没有赋值。可能会造成漏洞。
⼆次注⼊绕过:
⼆次注⼊的原理,在第⼀次进⾏数据库插⼊数据的时候,仅仅只是使⽤了 addslashes 或者是借助 magic_quotes_gpc 对其中的特殊字符进⾏了转义,但是addslashes有⼀个特点就是虽然参数在过滤后会添加 “\” 进⾏转义,但是“\”并不会插⼊到数据库中,在写⼊数据库的时候还是保留了原来的数据。
http头信息注⼊绕过:
通常 程序员会设置全局过滤防⽌SQL注⼊,开启之后 GET POST COOKIE这些传⼊过来的值都会进⾏过滤。对http头信息的值不但是直接获取,⽽且不会对其进⾏过滤。在php中获取头信息,是针对客户端的 都是以HTTP开头。
难以绕过的防护,预编译语句和参数化查询:
由于预编译语句将SQL代码与数据分离,使得攻击者无法改变SQL命令的结构,因此除非应用程序本身有缺陷,否则很难绕过这种防护。
最小权限原则:
即使发生SQL注入,攻击者的操作也会受到数据库用户权限的限制,从而降低损害范围。

3、请参考pikachu靶场,审计并利用宽字节注入漏洞
如果mysql连接中有这样的语句:
mysql_query("SET NAMES 'gbk'"); set character_set_client=gbk
就有可能存在宽字节注⼊,该语句的作⽤是把传⼊的参数转换为GBK编码。这时候如果这样注⼊:id=1%df',就可以绕过addslashes()函数。
因为addslashes()函数⾸先在单引号(%27)前⾯加⼀个反斜杠(%5c),在GBK编码中,%df%5c为中⽂“運”,这就导致后⾯的单引号逃掉了。
%df%27===>(addslashes)====>%df%5c%27====>(GBK)====>運'
pikachu靶场宽字节注⼊代码:

4、命令注入漏洞常见的函数有哪些?
exec()用于执行一个外部程序,并返回最后一行输出。
system()类似于exec(),但它会直接输出结果并且只返回最后一个输出行。
shell_exec()执行命令并以字符串形式返回完整的输出结果。
passthru()执行一个外部程序并将原始输出传递给浏览器。
popen()打开进程文件指针,可以用来执行命令并与进程通信。
proc_open()执行命令并打开文件指针到进程,提供了对输入/输出/错误流更复杂的控制。
escapeshellcmd() 和 escapeshellarg()虽然这两个函数是设计用来帮助防止命令注入的,但如果使用不当或者在某些复杂情况下仍然可能有风险。
backticks (``)使用反引号包裹的命令等同于调用shell_exec()。
parse_ini_file()如果处理来自不受信任来源的.ini配置文件,可能会导致命令注入。

5、代码执行漏洞常见的函数有哪些?
eval() 函数会将传入的字符串作为PHP代码来执行。如果这个字符串包含了用户输入,则可能会导致严重的安全风险。
assert()类似于 eval(),assert() 也可以用于执行传递给它的表达式。当其参数包含用户输入时,可能存在危险。
preg_replace()(在PHP 5.5.0中已废弃,在PHP 7.0.0中移除)可以让正则表达式替换操作中的替换部分被执行为PHP代码。
call_user_func() 和 call_user_func_array()这些函数允许动态调用其他函数或方法。如果函数名或方法名是基于用户输入确定的,那么就有可能被利用来进行代码执行。

6、如何结合伪协议通过文件包含漏洞读取文件?请简述原理
本地文件包含 :
如果PHP配置允许(即allow_url_include设置为On),攻击者可以通过提供带有伪协议的路径来尝试读取本地文件。例如,使用php://filter/read=convert.base64-encode/resource=/etc/passwd来读取并以Base64编码形式输出/etc/passwd文件的内容。
远程文件包含:
当allow_url_fopen或allow_url_include开启时,攻击者可以尝试通过HTTP或HTTPS协议包含远程文件,比如http://malicious-server/payload.php。这通常用于执行远程托管的恶意代码。

7、复习php常见漏洞
SQL注入
描述:当用户输入未被正确验证或转义时,攻击者可以通过构造特殊的SQL语句来操纵数据库。
防护措施:使用预编译语句和参数化查询。对所有用户输入进行严格的验证和过滤。
2. 文件包含漏洞
描述:通过操纵文件路径参数,攻击者可以强制服务器加载并执行任意文件。
防护措施:避免基于用户输入动态加载文件。使用白名单限制允许包含的文件。禁用allow_url_include配置项以防止远程文件包含。
3. 命令注入
描述:如果用户输入直接用于构建系统命令,则攻击者可插入恶意指令。
防护措施:不要使用不受信任的数据作为命令的一部分。使用安全API代替直接调用shell命令。对任何传递给命令函数的数据进行严格验证。
4. 代码执行漏洞
描述:某些PHP函数如eval()、assert()等可以直接执行传入的字符串为PHP代码。
防护措施:尽量避免使用这些危险函数。如果必须使用,确保传入数据经过严格的验证和消毒。
5. 反序列化漏洞
描述:当处理不可信来源的序列化数据时,可能会触发对象内的魔术方法,从而执行任意代码。
防护措施:永远不要反序列化不受信任的数据。使用安全的方式存储和传输复杂数据结构,比如JSON格式。
6. XSS
描述:攻击者可以在网页上插入恶意脚本,当其他用户浏览该页面时执行。
防护措施:对所有输出到浏览器的内容进行适当的HTML实体编码。
7. CSRF
描述:攻击者诱导用户在已认证的状态下向应用发送伪造请求。
防护措施:使用CSRF令牌验证每个表单提交和重要操作。
8. 不安全的身份验证和会话管理
描述:薄弱的登录机制或不安全的会话处理可能导致账户劫持。
防护措施:强制使用强密码。正确配置会话设置,例如使用HTTPS、设置正确的Cookie属性等。
9. 文件上传漏洞
描述:不当处理用户上传的文件可能导致恶意文件被执行或传播恶意软件。
防护措施:严格验证上传文件的类型和大小。存储上传文件于非公开目录,并重命名文件以防止直接访问。
10. 错误处理和信息泄露
描述:详细的错误消息可能会暴露敏感信息,帮助攻击者了解系统的内部工作原理。
防护措施:在生产环境中禁用显示详细错误信息的功能。记录错误日志但不在前端展示过多细节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/863567.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【自动化测试】Pytest之conftest详解

conftest介绍 pytest中定义个conftest.py来实现数据,参数,方法、函数的共享。 conftest.py 的文件名称是固定的, pytest 会自动识别该文件,可以理解成一个专门存放 fixture 的配置文件。一个工程下可以建多个 conftest.py 文件,一般我们都是在工程根目录下设置的 conftest…

【Spring开发】 老板爱瞎改权限怎么办:注解+AOP 打造复杂权限体系

引言一、权限控制的基本概念二、系统需求分析三、库表设计四、权限控制的注解设计五、切面实现六、权限控制的业务逻辑实现七、结论引言 在软件开发的世界里,权限控制是确保数据安全和业务流程合规性的关键。然而,当老板或管理层频繁地调整权限设置时,这不仅会打乱开发节奏,…

01.03 CW 模拟赛 T2. game

思路 先把赛时的思路搬一下你发现确定两个人的起始点, 其实是可以确定 \(\rm{Alice}\) 的选点可能的, 考虑写个代码验证一下 具体的, 就是分成两个弧, \(\rm{Alice}\) 可以选择一个弧的优势(过半), 然后其他的劣势 感觉现在是猜结论, 全靠感性, 我也不知道怎么解释这个问题 那么…

1.3 可压缩流:喷管和机翼

1.3 可压缩流:喷管和机翼 前言 劳张、劳江必看,劳高请随缘。 超音速喷嘴 基本 对于等熵流动,给出速度变化和管道截面面积变化的关系式: \[\begin{equation}(M^2-1)\frac{dV}{V}=\frac{dA}{A} \end{equation} \]对该公式分3种情况讨论:低速、亚音速,M<1:此时\(M^2-1&l…

C++程序运行的三种方式

1、源代码的注释,2、c++运行方式一、例程 编一个程序,计算机随机产生一个整数(1至5),自己输入一个整数,若两数相同,则输出“恭喜你,中奖了!奖金10元”,否则输出“没中奖,请付费2元”;同时公布中奖号码。 #include <iostream> #include <cstdlib> …

25.01.03

-1喜欢我 \(O(n^2 \log^2 n)\) 过 \(2e5\) 吗😋_ _ _ _ _ _ Ciallo~(∠・ω< )⌒★A 有解的一个必要不充分条件是: 设 \(L_i\) 表示 \(l \le i\) 的左端点数量,\(R_i\) 表示 \(r < i\) 的右端点数量,对于每个位置 \(i\) 满足 \(L_i \ge i \wedge R_i < i\)。 意…

MES 包装 称重 测试备忘

称的功能都差不多,需要MES适配不同品牌的称。 串口输出2中模式:可以调节 精度:精度0.1g 精度是0.001kg 第一种(默认):不停的串口输出。 输出速度很快,容易导致程序死掉。 第二种模式:重量稳定输出。 下面是重量稳定输出模式截图: ------ erwa.cn 二娃测试备忘

深度学习基础理论————训练加速(单/半/混合精度训练)/显存优化(gradient-checkpoint)

主要介绍单精度/半精度/混合精度训练,以及部分框架(DeepSpeed/Apex) 不同精度训练 单精度训练(single-precision)指的是用32位浮点数(FP32)表示所有的参数、激活值和梯度 半精度训练(half-precision)指的是用16位浮点数(FP16 或 BF16)表示数据。(FP16 是 IEEE 标准…

使用学生优惠创建 Azure Database for MySQL 数据库

文章首先强调了需要一个已通过学生认证的 Azure 账户,然后详细讲解了从登录 Azure 门户页面、选择免费服务、配置服务器和网络等步骤,最终成功创建并部署 Azure Database for MySQL。前言 在此之前,你需要拥有一个已通过学生认证的 Azure 账户。关于通过 Azure 学生认证,网…

【Windows】修改虚拟内存位置

这篇文章详细介绍了如何在 Windows 系统中将虚拟内存文件(pagefile.sys)从 C 盘移动到其他盘。步骤包括查看文件位置、检查和关闭 C 盘加密、修改注册表、设置新的虚拟内存位置并重启电脑,最终实现文件转移。问题:系统优化中,希望将pagefile.sys文件(即虚拟内存)移动到其…

ex7.3

import numpy as np from scipy.interpolate import lagrange import matplotlib.pyplot as plt import matplotlib yx = lambda x: 1/(1+x**2) def fun(n): x = np.linspace(-5, 5, n+1) p = lagrange(x, yx(x)) # n次插值多项式 return p x0 = np.linspace(-5, 5, 100) plt…

【hashMap扩容】关于hashMap扩容以后,新下标的理解

首先我们知道hashMap在存取元素的时候的下标算法是这样子的 根据当前元素(e)的hash值((e.hashCode()) ^ (e.hashCode() >>> 16))去与上当前hashMap的容量减一(Cap-1) put和get都是如此 put get所以在扩容算法中,元素的坐标也应是用这种方式存的,看一下代码我们会发现…