代码审计
四个文件包含函数的区别
include()和include_once()在包含文件时即使遇到错误,后续的代码依然会继续执行;
require()和require_once()则会直接报错退出程序。
正则匹配的含义、
addslashes()函数:返回在预定义的字符前添加反斜杠的字符串。
预定义字符是:
- 单引号(')
- 双引号(")
- 反斜杠(\)
- NULL
撞库漏洞
撞库漏洞是指登录口没有做登录次数限制,导致可以使用不同的用户及密码进行不断的登录尝试,以遍历用户密码
也可以理解为登录爆破
用户名和密码错误次数都无限制
单时间段内用户的密码错误次数限制
单时间段内IP登录错误次数限制
针对撞库漏洞比较好的解决方案是
使用登录验证码
多因素认证
php内置过滤函数
SQL 注入过滤函数有 addslashes()、mysql_real_escape_string()
以及 mysql_escape_string(),
它们的作用都是给字符串添加反斜杠(\)来转义掉单引号(')、双引号('')、反斜线(\)以及空字符 NULL。
XSS注入过滤函数
htmlspecialchars()函数的作用是将字符串中的特殊字符转换成HTML实体编码,如
& 转换成&
" 转换成"
' 转换成'
< 转换成<
> 转换成>
strip_tags()函数则是用来去掉HTML及PHP标记
命令执行过滤函数
escapeshellcmd()和escapeshellarg()
变量覆盖的两个函数、
extract()函数和parse_str()函数
extract函数覆盖变量的三种情况:
1、type类型为:EXTR_ OVERWRITE它表示如果有冲突,则覆盖已有的变量
2、type类型为:EXTR_IF_EXISTS它表示仅在当前符号表中已有同名变量时,覆盖它们的值,其他的都不注册新变量。
3、只传入第一个参数时,默认为EXTR_OVERWRITE模式
parse_str函数
解析字符串并且注册成变量
它在注册变量之前不会验证当前变量是否已经存在,所以会直接覆盖掉已有变量
void parse_str ( string $str [, array &$arr ])
第二个参数$arr是一个数组,注册的变量会放到这个数组里面,但是如这个数组原来就存在相同的键 (key),则会覆盖掉原有的键值。
宽字节注入
Set names gbk时存在宽字节注入
在使用PHP连接MySQL的时候,当设置“set character_set_client=gbk”时会导致一个编码转换的注入问题,也就是我们所熟悉的宽字节注入,当存在宽字节注入漏洞时,注入参数里带入%df%27('),即可把程序中过滤的\ (%5c)''吃''掉。
告诉MySQL服务器客户端来源数据编码是GBK,然后MySQL服务器对查询 语句进行GBK转码导致反斜杠\被%df吃掉,而一般都不是直接设置character_set_ client=gbk,通常的设置方法是SET NAMES 'gbk'
"set names gbk”其实干了三件事,等同于:
SET character_set_connection='gbk' , haracter_set_results=' gbk' ,
character_set_client= 'gbk'
因此在MySQL版本大于4.1小于5的情况下,基本所有跟数据库有关的操作都存在宽字节注入。
注意:
magic_quotes_gpc =Off
magic_quotes_sybase =Off
防范:
1)在执行查询之前先执行 SET NAMES 'gbk',character_set_client=binary
2)使用 mysql_set_charset('gbk')设置编码,然后使用 mysql_real_escape_string() 函数过滤参数。
3)使用PDO方式,在PHP5.3.6及以下版本需要设置setAttribute(PDO::ATTR_EMULATE_PREPARES, false);来禁用 prepared statements 的仿真效果。
问答:根据敏感参数回溯参数过程
非函数使用不当的漏洞,如SQL注入也有一些特征,比如SELECT、INSERT等再结合FROM和WHERE等关键字,也可以判断是否是一条SQL语句。通过对字符串的识别分析,就能判断这个SQL语句里面的参数有没有使用单引号过滤。
优点:只需搜索相应敏感关键字,即可以快速地挖掘想要的漏洞,具有可定向挖掘和高效、高质量的优点。
缺点:由于没有通读代码,对程序的整体框架了解不够深入,在挖掘漏洞时定位利用点会花费一点时间,另外对逻辑漏洞挖掘覆盖不到。
对称密码SM1、
对称加密算法,加密强度为128位,,采用128位密钥进行分组加密,采用硬件实现
文件包含截断:
如果不能写入以.php为扩展名的文件,需要截断。
1、利用%00来截断,开启GPC时不可用。PHP5.3之后的版本不可用。
2、利用多个英文句号(.)和斜杠(/)(??)来截断,这种方式不受GPC限制,PHP5.3版本之后不可用。
3、利用问号(?)来伪截断,不受GPC和PHP版本限制,只要能返回代码给包含函数,就能执行
伪截断原理:
这时候 Webserver把问号(?)之后的内容当成是请求参数,而txt不在Webserver里面解析。参数对访问l.txt返回的内容不影响,所以就实现了伪截断
防止dom型xss的类型
防御DOM XSS:
1、避免客户端敏感操作
2、分析和强化客户端的JavaScript代码
3、Anti-XSS
4、HttpOnly
预防xss通用方法
1、过滤掉相关的特殊字符
2、标签事件属性黑白名单
3、输出编码:htmlspecialchars()函数
存储型:
magic_quotes_gpc =Off
magic_quotes_sybase =Off
magic_quotes_runtime =Off
找输出点、输入点!
XSS过滤的函数:
mystrip_tags()个函数调用了new_html_special_chars() 和remove_ xss() 函数来过滤XSS
new_html_special_chars()
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 >
remove_xss()
是对一些标签关键字、事件关键字以及敏感函数关键字进行了替换
foreach函数$$变量覆盖防范:
1、不进行变量注册,建议直接用原生的$_GET、$_POST等数组变量进行操作
2、如使用extract()函数则可以配置第二个参数为EXTR_ SKIP
3、不建议使用import_request_variables()函数注册全局变量
常见代码审计思路
1. 根据敏感关键字或函数回溯参数传递过程
2. 查找可控变量,正向追踪变量传递过程。
3. 寻找敏感功能点,通读功能点代码。
4. 直接通读全文代码
文件管理思路
防御:禁止写入脚本可在服务端执行的文件
限制文件管理功能操作的目录
限制文件管理功能访问权限
禁止上传特殊字符文件名的文件
preg_match_all函数
preg_match_all() 函数用于进行正则表达式全局匹配,成功返回整个模式匹配的次数(可能为零),如果出错返回 FALSE 。
int preg_match_all( string pattern, string subject, array matches [, int flags ] )
PS:将匹配后的字符存入数组matches中。
Ecshop逻辑错误注入分析
这个漏洞的逻辑问题就在于本来一个已经过滤掉特殊字符的参数,又再次被用户自定义提交上来的参数替换,导致原来的过滤符号反斜杠被替换掉
不严谨的正则表达式
没有使用^和$限定匹配开始/结束位置
preg_match('/\d+\.\d+\.\d+\.\d+/',$ip)可以绕过
应使用:preg_match('/^\d+\.\d+\.\d+\.\d+$/',$ip)
正则:
PHP 中使用正则表达式主要通过一组内置的函数,其中最常用的是:
preg_match(): 在字符串中搜索匹配的模式,只返回第一个匹配项。
preg_match_all(): 在字符串中搜索匹配的模式,返回所有匹配项。
preg_replace(): 在字符串中搜索匹配的模式,然后进行替换。
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“\n”匹配字符“n”。“\\n”匹配一个换行符。序列“\\”匹配“\”而“\(”则匹配“(”。
^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。
* 匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等价于{0,1}。
.点 匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“[\s\S]”的模式。
[xyz] 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。
[^xyz] 负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。注意:只有连字符在字符组内部时,并且出两个字符之间时,才能表示字符的范围; 如果出字符组的开头,则只能表示连字符本身.
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
\B 匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”
\d 匹配一个数字字符。等价于[0-9]。
\D 匹配一个非数字字符。等价于[^0-9]。
\n 匹配一个换行符。等价于\x0a和\cJ。
\s 匹配任何空白字符,包括 空格、换行符、制表符、换页符、中文全角空格等等。等价于[ \f\r\n\t\v]。
\S 匹配任何非空白字符。等价于[^ \f\r\n\t\v]。
w 匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。
\W 匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
修饰符:
i 忽略大小写,匹配不考虑大小写
m 多行独立匹配,如果字符串不包含[\n]等换行符就和普通正则一样。
s 设置正则符号 . 可以匹配换行符[\n],如果没有设置,正则符号.不能匹配换行符\n。
x 忽略没有转义的空格
e eval() 对匹配后的元素执行函数。
A 前置锚定,约束匹配仅从目标字符串开始搜索
D 锁定$作为结尾,如果没有D,如果字符串包含[\n]等换行符,$依旧依旧匹配换行符。如果设置了修饰符m,修饰符D 就会被忽略。
S 对非锚定的匹配进行分析
U 非贪婪,如果在正则字符量词后加“?”,就可以恢复贪婪
X 打开与perl 不兼容附件
u 强制字符串为UTF-8编码,一般在非UTF-8编码的文档中才需要这个。建议UTF-8环境中不要使用这个。
preg_replace 函数
对字符串进行正则处理
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject)
捜索$subject中匹配$pattern的部分,以$replacement进行替换,而当$pattern处存在/e修饰符时,$replacement的值会被当成PHP代码来执行
preg_replace("/\[(.*)\]/e",'\\1',$_GET['str']);
第1个参数:从$_GET['str']变量中搜索中括号[]中间的内容作为第一组结果
/ /:正则表达式开始和结束
\[ :匹配 [
\]:匹配 ]
( ):标记一个子表达式的开始和结束位置
. :匹配除换行符 \n 之外的任何单字符
*:匹配前面的子表达式零次或多次
文件读取漏洞:
原理:部分程序在下载文件或者读取显示文件的时候,读取文件的参数filename直接在请求里面传递
后台程序获取到这个文件路径后直接读取返回,问题在于这个参数是用户可控的,可以直接传入想要读取的文件路径即可利用。
挖掘:
黑盒:看功能点对应的文件,再去读文件
白盒:搜索文件读取的函数:
file_get_contents()、highlight_file()、fopen()、 readfile() 、fread()、fgetss()、fgets()、parse_ini_file()、show_source()、file()
文件包含函数include或者php://filter/也可以利用
文件上传漏洞:
直接搜索move_uploaded_file()函数
其中问题比较多的是黑名单限制文件格式以及未更改文件名的方式
文件删除漏洞:
漏洞原理跟文件读取漏洞差不多
黑盒:直接测试一下看能不能删除某个文件
白盒:搜索带有变量参数的unlink(), 回溯变量
unlink():删除文件。如果成功,该函数返回 TRUE。如果失败,则返回 FALSE。
Metinfo任意文件删除分析
首先判断请求的action参数的值是不是delete,如果是则进入文件删除功能。
判断如果不是sql文件后,就直接在databack目录删除提交的文件名
代码中 $filenames函数从GET中提交,只要请求:
/recovery.php? action=delete&filenames=../../index.php
即可删除index.php文件。
注:相对路径
自databack开始
文件操作漏洞防范
1、对权限的管理要合理
2、用更安全的方法来替代直接以文件名为参数
3、避免目录跳转的问题
bugfree重装漏洞
原理:
存在逻辑漏洞:使用了header(),并没有使用die()或者exit()等函数退出程序流程
这个跳转只是HTTP头的跳转,下方代码依然会继续执行
这时候如果使用浏览器请求install/index.php文件则会跳转到安装页面
危害:
1、在安装时可写入后门到配置文件从而Getshell
2、重装后登陆后台直接getshell
PHP配置文件指令:
PHP_INI_*的定义
PHP_INI_ALL:可在 任何地方设置
PHP_INI_USER:可在用户的PHP脚本与Windows注册表中设置
PHP_INI_PERDIR:可在php.ini,.htaccess,httpd.conf中设置
PHP_INI_SYSTEM:可在php.ini,httpd,conf中设置
php.ini only:只能在php.ini中设置
配置选项
Regisyer_globals(全局变量注册开关)
该选项在设置为on的情况下,会直接把用户GET、POST等方式提交上来的参数注册成全局变量并初始化值为参数对应的值,使得提交参数可以直接在脚本中使用。
Allow_url_include(是否允许包含远程文件)
可以直接包含远程的文件,在$var可控的情况下,可以通过include($var)执行php代码
Magic_quotes_gpc(魔术引号自动过滤)
在GET,POST,COOKIE三个超全局变量中的单引号,双引号,反斜杠,空字符前自动加反斜杠
Magic_quotes_runtime(魔术引号自动过滤)
对数据库,文件中获取的数据里的单引号,双引号,反斜杠,空字符前自动加反斜杠
有部分函数不受其影响
Magic_quotes_sybase(魔术引号自动过滤)
会覆盖_gpc配置选项
对GET,POST,COOKIE三个超全局变量中的空字符进行转义,并将单引号转为双引号
Safe_mode(安全模式)
文件操作函数只能操作同一用户在同一目录或配置中目录的文件
命令执行函数会报错,如popen(),system(),exec()
open_basedir php可访问目录
限制php只能访问哪些目录
Disable_functions(禁用函数)
用于禁止一些函数的使用,在php.ini文件中设置,用逗号分隔函数名
Display_errors error_reporting错误显示
display errors 表明是否显示PHP脚本内部错误的选项
以下为错误显示的级别:
- 1 E_ERROR 报告导致脚本终止运行的致命错误
- 2 E_WARNING 报告运行时的警告类错误(脚本不会终止运行)
- 4 E_PARSE 报告编译时的语法解析错误
- 8 E_NOTICE 报告通知类错误,脚本可能会产生错误
- 2047 E_ALL 报告所有的可能出现的错误
代码审计工具 掌握seay特点,其他的掌握名字
Seay源代码审计系统(C#,针对PHP):
(1)一键自动化白盒审计,新建项目后,在菜单栏中打开“自动审计”即可看到自动审计界面。点击“开始”按钮即可开始自动化审计。
(2)代码调试,代码调试功能极大地方便了审计师在审计过程中测试代码。
(3)正则编码,Seay源代码审计系统集成了实时正则调试功能,
(4)自定义插件及规则,seay源代码审计系统支持插件拓展
除此外还有 FortifySCA,RIPS,FindBugs,Codescan等
漏洞验证工具 掌握功能
Burp suite
Proxy功能
核心功能,代理抓包
Intruder功能
用于暴力破解
Repeater功能
用于重发测试
浏览器拓展
hackerbar
点击Load URL即可从Firefox 地址栏获取当前URL,点击Execute 之后即可发送设置好的请求数据。
firebug
可以修改HTML,CSS元素,可以嗅探请求与响应包
Modify
可以全局修改HTTP请求头
常见代码审计四种思路
- 根据敏感关键字或函数回溯参数传递过程
- 查找可控变量,正向追踪变量传递过程。
- 寻找敏感功能点,通读功能点代码。
- 直接通读全文代码
敏感函数回溯参数过程
优点:只需搜索相应敏感关键字,即可以快速地挖掘想要的漏洞,具有可定向挖掘和高效、高质量的优点。
缺点:由于没有通读代码,对程序的整体框架了解不够深入,在挖掘漏洞时定位利用点会花费一点时间,另外对逻辑漏洞挖掘覆盖不到。
espcms操作
双击定位审计后的可疑代码到该行
选中变量可以看到变量传递过程,点击跳到传递过程处
选中函数可以跳到函数主体
可以全局搜索类的实例化
漏洞本身为没有任何过滤的SQL注入
通读全文代码需掌握的关键字和功能
- 函数集文件,通常命名中包含functions 或者 common 等关键字,这些文件里面是一此公共的函数,提供给其他文件统一调用,所以大多数文件都会在文件头部包含
- 配置文件,通常命名中包括 config 关键字,配置文件包括 Web 程序运行必须的功能性配置选项以及数据库等配置信息。从这个文件中可以了解程序的小部分功能,
- 安全过滤文件,安全过滤文件对我们做代码审计至关重要,关系到我们挖掘到的可疑点能不能利用,通常命名中有 filter、safe、check 等关键字。
- index 文件,index是一个程序的入口文件,所以通常我们只要读一遍index文件就可以大致了解整个程序的架构、运行的流程、包含到的文件
阅读全文的优点和缺点
优点:可以更好地了解程序的架构以及业务逻辑,能够挖掘到更多、更高质量的逻辑漏洞
缺点:花费的时间比较多,如果程序比较大,读起来也会比较累
根据功能定向审计
- 文件上传功能
- 文件管理功能
- 登录认证功能
- 找回密码功能
bugfree重装漏洞代码看懂代码
sql注入的利用方式
SQL 注人的攻击方式有下面几种:
- 在权限较大的情况下,可以直接写入 webshel,或者直接执行系统命令等。
- 在权限较小的情况下,可以通过注入来获得管理员的密码等信息,或者修改数据库内容进行一些钓鱼或者其他间接利用。
宽字节注入
出现:在使用PHP连接MySQL的时候,当设置“set character_set _client=gbk”时会的导致一个编码转换的注入问题
产生原理:由于单引号被自动转义成' ,前面的%df和转义字符\反斜杠(%5c)组合成了%df%5c,也就是“謰”字,这时候单引号依然还在,于是成功闭合了前面的单引号。
关于宽字节注入漏洞几种推荐方法
1)在执行查询之前先执行SET NAMES‘gbk’,character-set-client=binary设置character-set -client为binary
2)使用mysql-set-charset(gbk)设置编码,然后使用mysqL realescape string()函数被参数过滤
3)使用pdo方式,在PHP5.3.6及以下版本需要设置setAttribute(PDO::ATTREMULATE PREPARES,false);来禁用prepared statements 的仿真效果
更推荐一三
二次解码urldecode注入
原理是提交参数到 WebServer 时,WebServer 会自动解码一次,若php脚本中额外又有urlcode或者rawurldecode函数来解码,则可以绕过魔术引号。
利用方法为对单引号进行两次url编码后传参
SQL注入的防范
配置中选项
magic_quotes_gpc与magic_quotes_runtime
对int型不起作用
多种过滤函数和类
- addslashes函数:检查函数的参数(必须为string类型),一般在程序的入口使用。函数先判断是否开启GPC,若未开启,则对$POST,$GET等变量进行覆盖
- mysql[real]escape_string:函数对字符串进行过滤,过滤空字符,换行符,反斜杠,单双引号
- intval等字符转换:将变量换成int类型
XSS(跨站脚本攻击)
在访问恶意页面时触发恶意脚本进行攻击
挖掘经验:在输出函数中寻找未被过滤的参数
防范:特殊字符HTML实体转码,标签事件的黑白名单
CSRF(跨站请求伪造)
利用用户的cookie等特征伪造用户进行操作
挖掘经验:
黑盒:看非静态操作的页面有没有token与referer的验证
白盒:找代码里核心文件里面有没有验证token和referer相关的代码
防范:增加token验证(注意看懂P86的代码),增加验证码
文件操作漏洞
掌握函数include()、include once()、require()和require once()的区别
远程文件包含的截断方法
- %00截断:受GPC影响,5.3后被修复
- 多个.和/截断:5.3后被修复
- 远程文件包含时利用问号(?)伪截断
文件上传漏洞
字面意思
挖掘经验:敏感函数回溯,直接找move_uploaded_file()
绕过方法:
黑名单扩展名:不常用拓展名、截断文件名、利用php与系统获取拓展名不一致(".php "注意这里有个空格)
文件头,content-type绕过:GIF89a,抓包改包
代码执行函数使用方法和变量执行过程
- eval和assert函数 内部有无可控参数
- preg_replace函数的\e会将第二个参数(replacement)当做代码执行
- 动态函数,如$GET["xx"]($Post["xx"]);
- 调用函数过滤不严 对于call_user_func(),array_map()等,可以通过控制参数来调用目标函数
防范
通过正则的白名单,看懂P108的正则
挖掘经验:敏感函数回溯,如system(),exec(),反引号等,其中注意反引号调用的是shell_exec()
防范:escapeshellcmd()过滤整条命令,将特殊字符转义
escapeshellarg()过滤参数,将参数限制在一对双引号里,会参数中原有的双引号替换为空格,以确保参数为一个字符串。
变量覆盖漏洞
利用自定义的参数值替换原有的变量值
挖掘经验:extract()函数与parse_str()函数,$$关键字
extract():将数组注册为变量(注意PHP中的数组为键值对)
只有第二个参数为EXTR_IF_EXISTS,EXTR_OVERWRITE或缺省是才会覆盖
parse_str()函数的作用是解析字符串(格式为"a=1")并且注册成变量,在注册变量之前不会验证当前变量是否已经存在,所以会直接覆盖掉已有变量。
import_request_variables():把GET、POST、COOKIE的参数注册成变量,可用在register globals 被禁止的时候。
$$关键字:看懂P119
逻辑处理漏洞
等于或存在判断
in_array():比较前自动做类型转换,若数组里为数字,则数字开头的字符串会转化为数字
is_numeric():对十六进制直接判断为true
双等于与三等于:双等于不判断类型,三等于判断类型
代码分析
看懂P128 Ecshop
绕过小技巧
$SERVER,$FILE不受GPC保护
编码转换都可能导致类似于宽字节注入的问题
trim()函数传入数组会报错,通过报错获取web路径
%00截断
iconv()函数遇到不能处理的字符时,后面的字符串都不会被处理,也可以用于截断
php://输入输出流的作用
php://input 读取POST提交上来的原始数据
php://output:将流数据输出
php://filter:对文件进行读写
/resourece指定数据源(/resource="example.txt")
/read指定过滤方式(/read=string.rot13)
php代码解析标签
1)脚本标签:<script language="php">...</script>,类似于javascript
2)短标签:<?...?>,使用短标签前需要在php.ini中设置short_open_tag-on,默认是on状态。
3)asp标签:<%...%>,在PHP3.0.4版后可用,需要在 php.ini中设置asp_tags-on.默认是off。
fuzz
fuzz指的是模糊测试,对目标输入大量不同的参数来找出bug
正则表达式
注意用^与$限定开始与结束
特殊字符需要转义(如".")
报错注入
着重记忆floor(),updatexml(),extractvalue()三个函数会导致报错注入
Windows下搜索不知名文件
将不可知字符用"<<"或">>"代替,"<",">"也可以,但只能代替一个,而前两者可以代替多个。
参数安全过滤
看懂第九章的三段代码
业务安全的解决方案
验证码
验证码绕过
防御:设置错误次数
不将验证码放在HTML或cookie
验证码请求一次后在后台强制刷新
短信轰炸
防御:限制同一个手机号,同一个IP一个时间段内请求接收短信的次数
登录
暴力破解(撞库)
防御:登录验证码与多因素认证
API登录
防御:采用随机登录秘钥
禁止搜索引擎收录API接口
登录密钥绑定主机
注册
防御:验证码
机器码拦截短时间多次注册
自学习识别垃圾账号
防止SQL与XSS
密码找回
防御:接收验证码的手机与邮箱不由用户控制
加强验证码复杂度
限制验证码错误次数
设置验证码失效时间
不将验证码保存在页面
取验证码时防止短信轰炸
验证码与用户名,邮箱绑定
查看,修改资料
防御:用户资源ID(如订单ID)绑定到用户
用户信息存储到session
投票 积分 抽奖
防御:机器码认证
操作需要登录,用户信息从session读取
充值支付
防御:保证数据可信,商品单价总价不从客户端获取
购买数量大于0
账户支付时锁定该账户,同时只能由一个请求操作
私信反馈
注意防XSS
远程地址访问
防御:限制填写内网与短地址
文件管理
数据库管理
防御:限制可以操作的数据库表
限制备份到服务器上的文件名
命令,代码执行
防御:严格控制该功能访问权限
设置命令白名单
设置独立密码
限制脚本可访问的路径
限制命令执行时的系统用户权限
文件、数据库备份
防御:控制该功能访问权限
文件名随机生成
API
防御:访问权限控制,只有登录后/拥有密钥才能调用
防止敏感信息泄露
防止SQL注入等常规漏洞
Comments NOTHING