代码审计与web安全-第四章作业-SQL注入
1.下列选项中,HTTP_ HOST参数属于的变量是( )D
AKaTeX parse error: Expected group after '_' at position 1: _̲_GET BPOST
C s COOKIE
D $ SERVER
HTTP_HOST 是一个由 web 服务器创建的环境变量,它包含了当前请求的主机名(Host header)。在 PHP 中,这个变量是通过 $_SERVER 这个超全局变量数组访问的。所以,当你看到 HTTP_HOST 参数时,它属于 $_SERVER 数组。
2.SQL注入中的宽字节注入主要是由于程序使用( ) 编码引起的B
A Unicode
B GBK
C UTF8
D MD5
宽字节注入主要是由于程序使用 GBK 编码引起的。这种注入攻击利用了GBK编码的特性,其中一个汉字由两个字节组成,如果第一个字节的ASCII值大于128,就可以将其与后面的字节结合,绕过某些安全过滤机制。
3.若在程序中对参数使用urldecode()函数进行了过滤,可能存在的注入方式为( )A
A二次URL 解码绕过
B Base64编码绕过
C JSON编码绕过
D MD5绕过
若在程序中对参数使用urldecode()函数进行了过滤,可能存在的注入方式为 二次URL 解码绕过。这是因为urldecode()函数可能会被用来对已经编码的数据进行解码,如果数据被编码两次,那么通过两次解码就可能绕过安全过滤,从而引发注入攻击。
4.下列选项,PHP中属于字符串替换的函数是( )C
A substrreplace()
B pregreplace()
C Strreplace()
D preg_ split()
正确答案是 Strreplace()。在 PHP 中,str_replace() 函数用于替换字符串中的一些字符。这个函数是区分大小写的,并且可以处理字符串和数组。 例如:
echo str_replace("world", "Shanghai", "Hello world!");
上面的代码会输出 “Hello Shanghai!”,因为它将 “Hello world!” 中的 “world” 替换成了 “Shanghai”。
5.下列选项中,不属于PHP防御SQL注入的通用过滤函数的是( )D
A mysql escape string
B intval
C adslashes
D str replace
在 PHP 中,用于防御 SQL 注入的通用过滤函数不包括 str_replace。str_replace() 函数用于字符串替换,并不具备过滤或转义字符串以防止 SQL 注入的功能。
其他选项中,mysql_escape_string() 和 addslashes() 都是用于转义字符串中的特殊字符,而 intval() 用于将变量转换为整数,这些都可以在一定程度上帮助防止 SQL 注入。
6.在SQL注入中将已经过滤后的“\”吃掉的注入方式为( )A
A 宽字节注入
B 报错注入
C GET注入
D Cookie注入
在 SQL 注入中,将已经过滤后的“\”吃掉的注入方式为 宽字节注入。这种注入方式利用了某些字符集的特性,如 GBK 或 Big5,其中一个汉字由两个字节组成,如果第一个字节的 ASCII 值大于 128,就可以将其与后面的字节结合,绕过某些安全过滤机制
7.若程序中使用将敏感字符替换为空,可以绕过的方法为( )D
A大写绕过
B 编码绕过
C双写绕过
D简单绕过
绕过敏感字符替换的方法有多种。让我们看一下这些选项:
大写绕过:在某些情况下,大小写敏感的过滤器可能无法识别大写形式的关键字。例如,将 SELECT 改写为 SeLeCt。
编码绕过:使用特殊编码或十六进制表示来绕过过滤。例如,将关键字或字符编码为十六进制,然后传递给程序。
双写绕过:将被禁止的字符直接删除,然后使用双写嵌套绕过。例如,将 AND 改写为 AANDND。
简单绕过:这是一个泛指,可能包括其他绕过方法。通常,这意味着使用一些技巧来绕过过滤器,但具体方法可能因情况而异。
所以,答案是:D 简单绕过
8.下列选项中,将SQL语句指定连接的形式设置为Binary,使用的参数是( )B
A character_ client
B character set_ client
C character
D character set
在将 SQL 语句指定连接的形式设置为 Binary 时,使用的参数是 character_ set_ _client。
9.下列选项中,可以有效地防御FILE注入漏洞的参数是( )C
A Magic_ quotes_ gpc
B Magic_ gpc
C Magic_ quotes_ runtime
D Magic _runtime
在防御 FILE 注入漏洞时,以下选项可以有效地防御:
C. Magic_ quotes_ _runtime
这个选项是用来控制 PHP 是否自动对用户输入的数据进行转义。启用 Magic_ quotes_ _runtime 可以自动将用户输入的数据中的特殊字符进行转义,从而减少文件包含漏洞的风险
10.下列选项中,可以获取HTTP头信息的函数是( )D
A getenv()
B getenvironment()
C get_ env()
D environment()
可以获取HTTP头信息的函数是 D. environment()。这是一个常见的方法,用于从请求中获取HTTP头部信息。
11.GET方式传递的数字型参数无法绕过addslashes()函数的过滤。×
正确
错误
错误。数字型参数在传递时,不需要用单引号 ’ 进行闭合,例如 SELECT productname FROM product WHERE productID=1 AND 1=1。由于 SQL 语句中没有单引号,攻击者只需在后面加上注入语句,addslashes() 函数对这些语句不起作用。这种情况多见于数字型参数注入,解决方法是先使用 intval() 函数进行强制转换12.
另外,宽字节注入也可能绕过 addslashes() 函数。如果 MySQL 连接中有类似 mysql_query(“SET NAMES ‘gbk’”) 的语句,即设置字符集为 GBK 编码,那么就有可能存在宽字节注入。在这种情况下,如果注入 id=5’,就可以绕过 addslashes() 函数
12.GET方式传递的字符型参数无法绕过addslashes()函数的过滤。×
正确
错误
错误。字符型参数在GET方式传递时,可以绕过addslashes()函数的过滤。让我们探讨一下一些情况,如何绕过这个函数。
编码绕过:
在某些情况下,字符串在传入数据库查询之前会有编码解码操作。如果在没有解码的情况下传入,就绕过了addslashes()函数的过滤。
例如,如果数据库的编码为GBK,那么宽字节注入就可能绕过addslashes()函数。在这种情况下,输入id=5’,就可以绕过addslashes()函数12.
宽字节注入:
宽字节注入要求:
数据库的编码为GBK。
使用了addslashes()函数。
宽字节注入的格式是在地址后先加一个%df,再加单引号。因为反斜杠的编码为%5c,在GBK编码中,%df%5c是繁体字“連”,从而成功逃逸单引号,闭合SQL语句,完成SQL注入3.
示例:id=-1%df’ union select 1,database(),user()–+
其他情况:
除了编码绕过和宽字节注入,还有其他方法可以绕过addslashes()函数,例如使用is_numeric()函数或其他特定情况下的处理方式。
总之,addslashes()并不是绝对安全的过滤方法,开发者在编写代码时应该综合考虑其他防护措施,如使用参数化查询或ORM框架,以防止SQL注入攻击。
13.对于无过滤参数注入通常可使用union注入获取数据。√
正确
错误
正确。对于无过滤参数注入,通常可以使用 Union 注入 来获取数据。让我们探讨一下 Union 注入的原理和步骤:
查找注入点类型:
首先,我们在 GET 请求的参数后添加单引号 ‘。如果报错,说明存在注入,因为引入的 SQL 语句出错。
例如,输入 id=1’,如果页面报错,那么可能存在字符型注入。
判断字段数:
使用 order by 来判断查询的字段数。例如,输入 id=1’ order by 3 --+,如果页面正常,说明前面查询了三列数据。
Union 查询要求前后两个查询结果的列数一致,因此我们需要知道前面查询了多少个元素。
确定回显点:
输入 id=1’ union select 1,2,3 limit 1,1 --+,查看回显。这里使用 limit 是为了让前面查询的结果为空,只显示后面查询语句的结果。
回显点是我们可以注入查询语句的位置。
爆库名:
使用 id=-1’ union select 1,database(),3 --+,获取当前数据库名称。
或者使用 group_concat() 将所有数据库名称连接成一行并输出。
爆表名:
使用 id=-1’ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=‘security’ --+,获取指定数据库中的所有表名。
爆字段名:
使用 id=-1’ union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=‘security’ and table_name=‘users’ --+,获取指定表中的所有字段名。
查数据:
使用 id=-1’ union select 1,group_concat(username,0x5c,password),3 from security.users --+,获取用户名和密码。
总之,Union 注入是一种常见的 SQL 注入技术,开发者应该采取防护措施,如使用参数化查询或 ORM 框架,以防止 SQL 注入攻击。
14.宽字节注入可以在编码设置不合理的情况下绕过防御函数addslashes().√
正确
错误
正确。宽字节注入可以在编码设置不合理的情况下绕过防御函数 addslashes()。让我们深入了解一下宽字节注入的原理和应对措施。
宽字节注入原理
通常情况下,SQL 注入点是通过单引号 ’ 来识别的。然而,当数据经过 addslashes() 处理时,单引号会被转义成无功能性字符,导致在判断注入点时失效。攻击者利用宽字节字符集(如 GBK 编码)将两个字节识别为一个汉字,绕过反斜线转义机制,并使单引号逃逸,从而实现对数据库查询语句的篡改1.
示例与 Payload 构造
假设有以下测试 Payload:
输入 Payload: ’ or 1=1 #
经过 addslashes() 处理后:\’ or 1=1 #
分析:
’ 的 URL 编码是 %27。
经过 addslashes() 处理后,’ 变成了 \',对应的 URL 编码是 %5c%27。
针对上述情况,可以构造绕过 Payload:
构造绕过 Payload: %df’ or 1=1 #
经过 addslashes() 处理后:%df\’ or 1=1 #
分析:
我们在 Payload 中的 ’ 之前加了一个字符 %df。
经过 addslashes() 处理后,%df’ 变成了 %df\',对应的 URL 编码为 %df%5c%27。
当 MySQL 使用 GBK 编码时,会将 %df%5c 解析成一个汉字,从而使得单引号 %27 成功逃逸。
防范措施
避免直接使用 addslashes():考虑替代方案,如使用预处理语句或更安全的转义函数。
严格验证用户输入:确保只接受符合预期格式和内容的数据。
统一字符编码方式:避免混合使用不同字符编码方式来处理字符串。
定期审查代码:持续审查代码以发现潜在漏洞,并及时修复。
通过加强对宽字节注入攻击原理及防范措施的了解,并采取相应措施加固系统安全性,可以有效降低系统受到此类漏洞威胁带来的风险。保障用户数据和系统完整性是开发人员不可或缺的责任与挑战
15.二次URL编码注入不能够绕过GPC保护。×
正确
错误
错误。二次URL编码注入可以绕过GPC(魔术引号)保护。让我详细解释一下宽字节注入和二次URL编码注入的原理以及如何绕过GPC保护。
宽字节注入
原理:
宽字节注入利用数据库编码不当,绕过GPC(魔术引号)的防护机制。
当数据库设置为宽字节字符集(例如GBK编码)时,宽字节注入可以绕开GPC。
宽字节字符集将两个字节识别为一个汉字,从而绕过反斜线转义机制,使单引号逃逸,实现对数据库查询语句的篡改。
示例:
假设输入参数为 id=5’。
经过一次URL解码,%27 解码成了单引号 ‘,即 id=5’。
如果数据库编码为GBK,那么 %27 可以被解析成一个汉字,从而绕过GPC。
二次URL编码注入
原理:
二次URL编码注入是指在已经进行一次URL编码的字符串上再次进行URL编码,从而绕过非法字符检测。
服务器首先对参数进行一次解码,然后再次解码,带入数据库中执行,导致SQL注入漏洞存在。
示例:
假设输入参数已经被一次URL编码,例如 id=1%2527。
服务器首先解码 %2527,得到 %27,然后再次解码,得到单引号 '。
这样就绕过了PHP缺省的过滤机制,使得单引号能够成功注入。
总之,宽字节注入和二次URL编码注入都是绕过GPC保护的方式。开发者应该采取其他防范措施,如使用参数化查询或ORM框架,以防止SQL注入攻击。
16.PDO预编译方式可以有效地防御SQL注入漏洞。√
正确
错误
正确。使用 PDO 预编译方式 可以有效地防御 SQL 注入漏洞。让我详细解释一下预编译的原理以及如何正确使用它。
预编译的原理
什么是预编译语句?
预编译语句是一种将 SQL 查询与参数分开处理的方法。它可以看作是编译过的 SQL 模板,可以使用变量参数进行定制。
预编译语句的好处:
查询只需解析(或预处理)一次,但可以用相同或不同的参数执行多次。
数据库在准备好查询后会分析、编译和优化执行计划,避免重复的分析/编译/优化过程。
为什么预编译有效防御 SQL 注入?
预编译语句将参数与 SQL 语句分离,参数不需要用引号括起来,驱动程序会自动处理。
如果应用程序只使用预编译语句,可以确保不会发生 SQL 注入(但其他部分仍需注意)。
正确使用 PDO 预编译
基本用法:
使用预编译语句时,将参数占位符(例如 ?)放入 SQL 查询中,然后传递参数执行。
例如:
$stmt = $conn->prepare('SELECT * FROM user WHERE id = ?');
$stmt->execute([$userId]);
注意事项:
避免在预编译之前将参数拼接到 SQL 语句中,这会导致 SQL 注入。
不要使用类似 mysql_real_escape_string() 的手动转义方法,预编译会自动处理。
总之,预编译是防御 SQL 注入的绝佳手段,但仍需注意其他部分的安全性。开发者应该遵循正确的使用方法,以确保应用程序的安全性。
17.常见的数字型SQL注入可使用报错注入或盲注入的方式来进行绕过。√
正确
错误
正确。常见的数字型 SQL 注入可以使用 报错注入 或 盲注 的方式来进行绕过。让我详细解释一下这两种方法。
报错注入
原理:
报错注入利用数据库执行 SQL 语句时产生的错误信息,从中获取有关数据库结构的信息。
当注入点存在时,构造恶意输入会导致 SQL 语句执行错误,数据库会返回相关错误信息。
步骤:
构造单引号 '、双引号 "、括号 ) 来闭合查询语句,直到报错证明注入点存在。
通过观察报错信息,分析 SQL 语句结构,构造特殊的 payload 进行注入。
盲注
原理:
盲注是指在没有直接回显查询结果的情况下,通过观察应用程序的行为来判断注入是否成功。
盲注分为布尔盲注和时间盲注。
布尔盲注:
通过构造条件,观察页面的不同行为(例如页面内容、响应时间)来判断查询是否成功。
示例:构造 AND 1=1 和 AND 1=2 条件,观察页面是否有区别。
时间盲注:
通过构造条件,观察页面响应时间的变化来判断查询是否成功。
示例:构造 AND IF(1=1, SLEEP(5), 0) 和 AND IF(1=2, SLEEP(5), 0) 条件,观察页面响应时间是否延长。
总之,报错注入和盲注是常见的数字型 SQL 注入绕过方法。开发者应该采取防范措施,如使用参数化查询或 ORM 框架,以防止 SQL 注入攻击。
18.addslashes()函数的功能和magic_ quotes_ gpc()不完全相同。√
正确
错误
正确。addslashes() 函数的功能和 magic_quotes_gpc() 不完全相同。让我详细解释一下它们之间的区别。
addslashes()
addslashes() 是 PHP 中的一个字符串处理函数。
功能:在指定的预定义字符前添加反斜杠。
预定义字符包括:
单引号 (')
双引号 (")
反斜线 (\)
NULL 字符
用途:通常用于将数据插入数据库之前,对特定字符进行转义,以防止 SQL 注入攻击。
magic_quotes_gpc()
magic_quotes_gpc() 是 PHP 中的一个配置选项。
功能:自动对进入 PHP 脚本的 GET、POST 和 COOKIE 数据进行转义。
默认情况下,magic_quotes_gpc 为 on,会自动运行 addslashes()。
注意:
不要对已经被 magic_quotes_gpc 转义过的字符串再次使用 addslashes(),否则会导致双层转义。
可以使用 get_magic_quotes_gpc() 检测是否打开了 magic_quotes_gpc。
总结
addslashes() 主要用于手动转义数据,而 magic_quotes_gpc() 是自动处理 GET、POST 和 COOKIE 数据的选项。
在处理代码时,最好是更改代码而不是依赖于 magic_quotes_gpc 的开启。现在开发者更加意识到了安全问题,并使用数据库转义机制或者 prepared 语句来取代魔术引号功能。
开发者应该根据具体情况,选择合适的方法来确保应用程序的安全性。
19.在PHP中mysql_ escape_ string()和mysqL real_escape_ string()函数效果是完全相同的。×
正确
错误
错误。mysql_escape_string() 和 mysql_real_escape_string() 函数在功能上是不完全相同的。让我详细解释一下它们之间的区别。
mysql_escape_string():
这个函数已经被弃用,不再推荐使用。
功能:将字符串中的特殊字符进行转义,以防止 SQL 注入攻击。
转义的字符包括:单引号 (')、双引号 (")、反斜线 (\)、NULL 字符。
注意:这个函数只是简单地将字符串中的特殊字符添加反斜杠,而不考虑连接的字符集。
mysql_real_escape_string():
这个函数是更安全的替代方案,用于防止 SQL 注入攻击。
功能:根据 MySQL 连接的字符集,对字符串中的特殊字符进行转义。
转义时会正确处理多字节字符,不会在字符中间插入转义字符。
需要传入一个 MySQL 连接资源作为参数,以确定字符串应该如何处理。
推荐做法:
考虑使用更现代的数据库访问方式,如 PDO 或 MySQLi。
最好使用参数化查询,而不是手动转义字符串。参数化查询更难出错,减少了受到 MySQL 缺陷影响的风险。
20.在PHP中进行URL解码的函数是urldecode.√
正确
错误
正确。在 PHP 中,进行 URL 解码的函数是 urldecode()。这个函数用于解码给出的已编码字符串中的任何 %## 以及中文等被编码的内容。加号(‘+’)被解码成一个空格字符。该函数经常被用于 PHP 解码 URL 中的中文字符串.
<?php
$str = "w3cschool%E4%BD%A0%E5%A5%BD";
echo urldecode($str); // 输出:w3cschool你好
?>
21.按照数据类型分类,SQL注入主要分为( )CD
A整数型
B浮点型
C数字型
D字符型
根据数据类型分类,SQL注入主要分为:
整数型注入:通常发生在数字型参数上,例如查询参数为数字的情况。攻击者通过构造恶意输入,使得数字型参数被解析成SQL语句的一部分,从而执行恶意操作。
字符型注入:发生在字符串类型的参数上,例如查询参数为字符串的情况。攻击者通过构造特殊的字符串,绕过输入验证,将恶意代码注入到SQL查询中。
搜索型注入:这是一类特殊的注入类型,通常发生在搜索功能中。用户输入的关键字被用于构造SQL查询,如果没有合适的过滤和验证,就容易导致注入。
综上所述,答案是 C. 数字型 和 D. 字符型。
22.在SQL注入中若无正常回显信息,则可以使用的方法是( )ABC
A时间盲注
B布尔盲注
C报错注入
D.手工注入
在 SQL 注入中,如果没有正常的回显信息,可以使用的方法包括:
A. 时间盲注:通过构造条件,观察页面响应时间的变化来判断查询是否成功。这种方法适用于无法直接观察查询结果的情况。
B. 布尔盲注:通过构造条件,观察页面的不同行为(例如页面内容、响应时间)来判断查询是否成功。这种方法通常用于判断布尔值的情况。
C. 报错注入:利用数据库执行 SQL 语句时产生的错误信息,从中获取有关数据库结构的信息。即使没有正常回显,错误信息也可能泄露有用的信息。
D. 手工注入:手动分析目标应用程序,尝试构造恶意输入,绕过输入验证,将恶意代码注入到 SQL 查询中。
因此,答案是 A. 时间盲注、B. 布尔盲注 和 C. 报错注入。
23.下列选项中,可能存在SQL注入点的是( )ACD
A COOKIE
B HPPT头
C POST参数
D Referer参数
根据常见的注入点,以下选项可能存在 SQL 注入点:
A. COOKIE
C. POST 参数
D. Referer 参数
这些位置通常是用户输入数据被传递到后台数据库进行查询或操作的地方。攻击者可以构造特定的输入,直接影响数据库查询,从而获取或修改数据库中的数据。
HTTP 头部信息(B. HTTP 头)和用户名密码等也可能存在注入点,但不如前三个选项常见。
24.下列选项中,属于SQL注入的内置过滤函数的是( )CD
A str_ replace()
B intval()
C addslashes()
D mysql escape_ string()
属于 SQL 注入防护的内置过滤函数是 C. addslashes()。这个函数用于在指定的预定义字符前添加反斜杠,以防止 SQL 注入攻击。预定义字符包括单引号 (')、双引号 (")、反斜线 (\) 和 NULL 字符。虽然 mysql_escape_string() 也可以用于转义字符串,但它已经被弃用,不再推荐使用。而 addslashes() 是更通用且更安全的选择。
其他选项不是专门用于 SQL 注入防护的内置过滤函数。
25.下列选项中,可以使用mysql_escape_string()函数过滤的特殊字符串包括()ABCD
A [\x00]
B [\n]
C [\r]
D []