代码审计

四个文件包含函数的区别

include()和include_once()在包含文件时即使遇到错误,后续的代码依然会继续执行; 
require()和require_once()则会直接报错退出程序。

正则匹配的含义、

addslashes()函数:返回在预定义的字符前添加反斜杠的字符串。

预定义字符是:

- 单引号(')
- 双引号(")
- 反斜杠(\)
- NULL

撞库漏洞

撞库漏洞是指登录口没有做登录次数限制,导致可以使用不同的用户及密码进行不断的登录尝试,以遍历用户密码
也可以理解为登录爆破

用户名和密码错误次数都无限制
单时间段内用户的密码错误次数限制
单时间段内IP登录错误次数限制

针对撞库漏洞比较好的解决方案是
使用登录验证码
多因素认证

php内置过滤函数

SQL 注入过滤函数有 addslashes()、mysql_real_escape_string()
以及 mysql_escape_string(),
它们的作用都是给字符串添加反斜杠(\)来转义掉单引号(')、双引号('')、反斜线(\)以及空字符 NULL。

XSS注入过滤函数
htmlspecialchars()函数的作用是将字符串中的特殊字符转换成HTML实体编码,如
& 转换成&
" 转换成"
' 转换成'
< 转换成&lt;
> 转换成&gt;
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()
& (和号)成为 &amp;
" (双引号)成为 &quot;
' (单引号)成为 '
< (小于)成为 &lt;
> (大于)成为 &gt;

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请求头

常见代码审计四种思路

  1. 根据敏感关键字或函数回溯参数传递过程
  2. 查找可控变量,正向追踪变量传递过程。
  3. 寻找敏感功能点,通读功能点代码。
  4. 直接通读全文代码

敏感函数回溯参数过程

优点:只需搜索相应敏感关键字,即可以快速地挖掘想要的漏洞,具有可定向挖掘和高效、高质量的优点。

缺点:由于没有通读代码,对程序的整体框架了解不够深入,在挖掘漏洞时定位利用点会花费一点时间,另外对逻辑漏洞挖掘覆盖不到。

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,抓包改包

代码执行函数使用方法和变量执行过程

  1. eval和assert函数 内部有无可控参数
  2. preg_replace函数的\e会将第二个参数(replacement)当做代码执行
  3. 动态函数,如$GET["xx"]($Post["xx"]);
  4. 调用函数过滤不严 对于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注入等常规漏洞

此作者没有提供个人介绍
最后更新于 2024-12-06