选择填空判断
- 代码审计是指对源代码进行检查。
- 代码审计需要多方面的技能:对编程的掌握、对漏洞形成原理的理解、对系统和中间件的熟悉。
- 黑盒测试也叫功能测试,是指不接触代码的情况下,测试系统的功能是否有bug,是否满足设计要求。
- 灰盒测试是介于白盒测试与黑盒测试之间的一种测试,灰盒测试多用于集成测试阶段,不仅关注输出、输入的正确性,同时也关注程序内部的情况。
- 白盒测试就是我们所说的代码审计,以开放的形式从代码层面上寻找bug,如果发现有bug则返回修复,直到没有bug才允许软件发布上线。
- 常见的代码审计思路:逆向追踪,检查敏感函数的参数,回溯变量;正向追踪,跟踪变量传递过程;直接挖掘功能点漏洞。
- 常见的代码审计思路:根据敏感关键字回溯参数传递过程、查找可控变量,正向追踪变量传递过程、寻找敏感功能点,通读功能点代码、直接通读全文代码。
- 常见Web漏洞有:SQL注入、XSS 跨站脚本攻击、CSRF 跨站请求伪造、文件操作、代码/命令执行、变量覆盖、逻辑处理。
- register_globals的作用是直接把用户GET、POST等方式提交上来的参数注册成全局变量并初始化值为参数对应的值。
- allow_url_include的作用是允许包含远程文件。
- magic_quotes_gpc的作用是会自动在变量中的单引号(')、双引号(")、反斜杠(\)及空字符(NULL)的前面加上反斜杠(\)。
- magic_quotes_gpc会过滤$_GET、$_POST、$_COOKIE,不会过滤$_SERVER变量。
- magic_quotes_runtime只对从数据库或者文件中获取的数据进行过滤。
- magic_quotes_sybase仅仅是转义了空字符和把单引号(')变成了双引号('')。
- Seay源代码审计系统主要特点是一键自动化白盒审计、代码调试、正则编码、自定义插件及规则。
- SQL注入漏洞的注入方式有普通注入、盲注、报错注入、宽字节注入、二次注入。
- 反斜线 \ 的URL编码为%5c。
- 宽字节注入漏洞利用是一般在参数后提交 %df。
- 宽字节注入的解决方法有使用pdo的方式,SET NAMES 'gbk',character_set_client=binary,使用 mysql_set_charset('gbk') 设置编码,然后使用 mysql_real_escape_string() 函数被参数过滤。
- 二次注入的原理是由于urldecode使用不当导致的。
- SQL注入漏洞防范函数有addslashes()、mysql_escape_string()、mysql_real_escape_string()。
- 文件操作包括文件包含、文件读取、文件删除、文件修改以及文件上传。
- 文件包含又分为本地文件包含(local file include)和远程文件包含(remote file include)。
- 文件包含函数中,include()、include_once()在包含文件时即使遇到错误,后续的代码仍然会继续执行;require()、require_once()则会直接报错退出程序。
- 代码执行漏洞是指应用程序本身过滤不严,用户可以通过请求将代码注入到应用中执行。
- 代码执行函数有eval()、assert()、preg_replace()、call_user_func()、call_user_func_array()、array_map()以及PHP动态函数 $a($b)。
- eval()、assert()这两个函数原本的作用就是用来动态执行代码。
- preg_replace()函数的作用是对字符串进行正则处理。
- preg_replace()函数的代码执行需要存在 /e 参数。
- call_user_func()函数第一个参数为回调函数,后面的参数为回调函数的参数。
- 可以执行命令的函数有system()、exec()、shell_exec()(或使用反引号`)、passthru()、pcntl_exec()、popen()、prpc_open()。
- 命令执行漏洞的防范大致有两种方式:一种是使用PHP自带的命令防注入函数,还有对命令执行函数的参数做白名单限制。
- 命令防注入函数有escapeshellcmd()和escapeshellarg()。
- 目前变量覆盖漏洞大多都是由于函数使用不当导致的,这些函数有:extract()、parse_str()、import_request_variables()。
- extract()该函数有三种情况会覆盖掉已有变量:第一种是第二个参数为EXTR_OVERWRITE,它表示如果有冲突,则覆盖已有的变量;第二种情况是只传入第一个参数,这时候默认为EXTR_OVERWRITE模式;第三种则是第二个参数为EXTR_IF_EXISTS,它表示仅在当前符号表中已有同名变量时,覆盖它们的值,其他的都不注册新变量。
- parse_str()函数的作用是解析字符串并且注册成变量,它在注册变量之前不会验证当前变量是否已经存在,所以会直接覆盖掉已有变量。
- 变量覆盖漏洞防范:使用原始变量$_GET、$_POST;验证变量存在,extract() 函数使用 EXTR_SKIP 参数。
- in_array()用来判断一个值是否在某一个数组列表里面。但是比较之前会自动做类型转换,导致可以被绕过。
- is_numeric()函数用来判断一个变量是否为数字。但是当传入的参数为hex时则直接通过并返回ture,而MySQL是可以直接使用hex编码代替字符串明文的,导致可以被绕过。
- 双等于(==)在判断等于之前会先做变量类型转换,三等于(===)不会。
- 需要先构造好利用代码写入网站进行保存,在第二次或多次请求后调用攻击代码触发或者修改配置触发的漏洞叫做二次漏洞。
- 画出二次漏洞的流程图:
- 有以下两种方式来显示报错信息:在PHP配置文件php.ini中设置display_errors = on;在代码中加入error_reporting()来显示错误信息。
- error_reporting()参数E_ALL 的意思 是提示所有错误,E_ERROR 的意思是显示错误信息(致命,终止执行脚本),E_WARNING 的意思 是显示错误信息(非致命,不终止执行脚本),E_NOTICE 的意思 是显示基础提示信息。
- iconv()用来做字符编码转换。当遇到不能处理的字符串则后续字符串不被处理。
- php://input 是个可以访问请求的原始数据的只读流,是读取POST提交上来的数据。
- enctype="multipart/form-data" 的时候 php://input 是无效的。
- php://output 是一个只写的数据流,允许你以 print 和 echo 一样的方式写入到输出缓冲区。
- php://filter 是一个文件操作协议,可以对磁盘中的文件进行读写操作。。
- fuzz指的是对特定目标的模糊测试。
- 微软的SQL Server数据类型转换报错函数有convert()、cast()。
- MySQL的报错SQL注入方式更多有floor()、updatexml()以及extractvalue()这三个函数。但实际上还有很多个函数都会导致MySQL报错并且显示出数据,它们分别是GeometryCollection()、polygon()、GTID_SUBSET()、multipoint()、multilinestring()、multipolygon()、LINESTRING()、exp()。
- Windows FindFirstFile利用方法:将文件名不可知部分之后的字符用
<< 或者 >> 代替即可访问不知道文件名的文件。
- SQL注入过滤函数有addslashes()、mysql_real_escape_string()、mysql_escape_string()。它们的作用都是给字符串添加反斜杠 \ 来转义掉单引号 '、双引号 "、反斜杠 \ 以及空字符 NULL。addslashes()和mysql_escape_string()直接在敏感字符前加反斜杠,可能会存在宽字节注入绕过的问题,而mysql_real_escape_string()函数会考虑当前连接数据库的字符集编码。
- XSS过滤函数有htmlspecialchars()、strip_tags()。
- htmlspecialchars()函数的作用是直接将字符串中的特殊字符转化成HTML实体编码。
- strip_tags()函数用来去掉HTML及PHP标记。
- 命令执行过滤函数有escapeshallcmd()、escapeshallarg()。
- escapeshallcmd()过滤方式:Windows在这些字符前面加上一个 ^ 符号。Linux在这些字符前面加上反斜杠 \ 。
- escapeshellarg()过滤方式:给所有参数加上一对双引号,强制为字符串。
- 加密是指将明文直接可见的数据以特定的算法进行混淆,以保证数据的安全掩蔽性。
- 在对称加密算法中常用的算法有DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES。
- 非对称加密算法有RSA。
- 单向加密也就是不可逆算法,常见的有MD系列(MD4、MD5)和sha1、sha192、sha256等。因为存在不可逆的性质,所以这类哈希算法通常用来保存密码和做数字签名。
- 王小云教授提出了密码哈希函数碰撞攻击理论,即模差分比特分析法,破解了包括MD5、SHA-1在内的5个国际通用哈希函数算法。
- 国家商用密码管理办公室制定了一系列的密码标准,包括SM1(SCB2)、SM2、SM3、SM4、SM7、SM9、祖冲之算法(ZUC)等等。其中对称算法为:SM1,SM4,SM7,祖冲之算法(ZUC),非对称算法为: SM2,SM9,哈希算法为:SM3。
- 验证码可以解决很多业务安全问题,比如撞库、垃圾注册,等等,可谓防御业务风险必备神器。
- 验证码有图片验证码、滑动验证码、短信/邮箱/电话、二维码等分类。
- 撞库漏洞有以下3种情况:用户名和密码错误次数都无限制、单时间段内用户的密码错误次数限制、单时间段内IP登录错误次数限制。
- 针对撞库漏洞比较好的解决方案是使用登录验证码和多因素认证。
- 对于用户注册,需要有以下几个安全设计思路:设计验证码。采集用户机器唯一识别码,拦截短时间内多次注册。根据账号格式自学习识别垃圾账号。防止SQL注入漏洞与XSS漏洞(常见)。
- 关于支付漏洞主要有四种,分别是客户端可修改单价、总价和购买数量以及利用时间差多次购买。
- 针对这四种支付漏洞情况的主要应对手法是:保证数据可信,商品单价及总价不可从客户端获取。购买数量不能小于等于0,也不能超过上限值65535。账户支付锁定机制,当一个支付操作开始就应该立马锁定当前账户,不能同时两个后端请求对余额进行操作。
- SSRF是指服务器端请求伪造漏洞。
- SSRF攻击的目标一般是从外网无法访问的内部系统。
- SSRF可以对外网服务器所在的内网进行扫描。
- 一个文件管理功能为了保证安全,在满足业务需求的情况下,设计的时候应该遵循以下几个点:禁止写入脚本可在服务器端执行的文件。限制文件管理功能操作的目录。限制文件管理功能访问权限。禁止上传特殊字符文件名的文件。
- 通常文件和数据库备份功能容易出现的问题有如下几种情况:未授权访问和越权访问。备份文件名可预测。生成的文件可利用Web中间件解析漏洞执行代码。
- 怎么设计备份功能:进行权限控制、文件名随机生成,不可预测。
- 如何限制用户登录:限制登录ip、双因素认证(手机验证码、动态令牌)。
- 多因素认证从字面意思就可以理解,即添加多种验证方式,敏感操作多次验证权限,验证的方式有如下7种:手机短信验证码。手机语言验证码。手机App动态令牌。邮箱验证码。实体令牌卡。电子图片令牌卡。硬件令牌。
- 一个网站的应用安全防御应该包括对输入的特殊字符过滤、输出过滤、异常访问检测、自身安全检测等等。
- 网站的应用安全防御中,自身安全检测方式有:木马查杀、弱后台地址检测、 弱口令检测等等。
- C语言安全需要注意哪些方面:提高任何c或C++应用程序的整体安全性;阻止利用不安全的字符串操作逻辑进行缓冲区溢出、栈溢出以及面向返回值的编程攻击;避免因不正确使用动态内存管理函数而导致的漏洞和安全缺陷;消除因有符号整数溢岀、无符号整数回绕和截断误差而导致的整数相关问题;执行安全的I/O操作,避免文件系统漏洞;正确使用格式化输出函数,避免引入格式字符串漏洞;在开发并发代码时,避免竞争条件和其他可利用的漏洞。
- 缓冲区溢出是指:将数据复制到不足以容纳数据的缓冲区,会导致缓冲区溢出。
- 缓冲区溢出经常发生在字符串操作中。为了避免这种错误,可以截断限制拷贝,最好确保目标区域的大小足以容纳复制数据和null结束符。
- C和C++都容易发生缓冲区溢出问题,因为这两种语言具有以下共同之处:将字符串定义为以空字符结尾的字符数组;未进行隐式的边界检査;提供了未强制性边界检查的标准字符串函数调用;取决于内存的位置以及溢出的规模,缓冲区溢出可能不会被侦测到,但它可能会破坏数据,导致程序岀现奇怪的行为甚至非正常中止。
- (判断)所有的缓冲区溢岀都会造成软件漏洞。(错)并非所有的缓冲区溢岀都会造成软件漏洞。
- UTF-8是一个多字节字符集,它可以表示在Unicode字符集中的每个字符,而且与美国7 位ASCII字符集向后兼容。每个UTF-8字符由1〜4个字节表示。
- 在C和C++中,操作字符串很容易产生错误。最常见的错误有4种,分别是无界字符串复制(unbounded string copy)、差一错误(off-by-one error)、空结尾错误(null termination error)以及字符串截断(string truncation)。
PHP案例分析题
宽字节注入
二次urldecode注入
文件包含漏洞(本地文件包含/远程文件包含)
代码执行漏洞
命令执行漏洞
变量覆盖
C语言程序分析题
不要对null指针进行解引用
缓冲区溢出
数组带来的问题之一是确定其元素数量
字符串计数安全问题案例
无界字符串复制
差一错误
空字符结尾错误
字符串截断
与函数无关的字符串错误