关于网站功能页未授权访问的问题

我在做安全工程师的时候经常会遇到审计一个网站发现网站后台输入 /admin/可能给你提示出一个登录页,输/admin/left.jsp 却又能直接访问的问题。也许你会告诉他们,访问功能页要判断当前是否存在有效会话和对应级别id,他们也许听完之后哦的一声就去加了一个if(sessionid=0 && !empty(session)){redirect(‘index’);}(只是举例,这样是不安全的)。但是等你复检的时候,再输个/left, 也会有可能遇到还是可以访问的问题。这个时候其实不是他们没有按照你说的做。而是没有做全。其实很多安全公司写的安全建议报告里面都是存在一项缺失的。那就是对网站模板的处理。不要小看这个模板,很多人你跟他说你的模板没处理,他青筋暴起瞪大眼睛跟你说,模板没处理不算没处理。实际上模板不处理有时候造成的后果也是不亚于功能脚本页没有进行有效会话判断的。比如说有的商业cms可能出于某些原因在js里实现了过多的功能,这些js里实现的功能参数往往过于详细,也许我们直接访问可能不容易猜测到js地址,但是模板页的源码通常情况下都会给我们一个很好的指引。那这里该如何处理呢?

Continue reading
Posted in php security, 安全控制 | Tagged , , , , | Leave a comment

不管家庭综合水平高低都不能过早结婚

前言: 大部分中国人的家庭都是由长幼组成的,因为一个家庭也是一个小社会,所以难免也会出现各式各样的问题。小到家长里短,大到武行争斗。因为涉及这个圈子的事情太多,一篇文章不可能全部说完,所以本文只描述一个离自己近的问题,也是近几年被询问不胜其烦的一个问题:你什么时候结婚?希望见过此文知道作者是谁的朋友和家人不要再重复问我相同的问题。如果反之,我可能会从新计算一下我们之间的关系。相互理解是共存的一大前提,希望所有人都能够明白。查看此文希望能够以平和的心气进行,如果你看到标题就已经火冒三丈,这只能说明我们的价值观存在本质上的不同。建议直接忽略。

我们知道,不管是什么生物,它都有三六九等,人自然也是如此。自中国的古代到了民国再到现在,虽历经大小战乱,也能够做到乱中有序,其中一个很重要的原因就是历代的治理者们掌握了分级管理之策。这个就好比如,如果我们用手拿着一团缠在一起的毛线试图让他变得有序,它又可能会因为我们不懂得怎么去握住毛线球或者手上沾了别的东西最终让它变得更乱。也许在一段时间过后,当我们更熟悉毛线时,才懂得先要固定线球,然后再让手掌保持干净,才更有可能的完成这件事情。如果我们本身就不熟悉它,直接就参与了整理线球这项工作,初衷可能是好的,但最终的结果可能会是坏的。很简单的道理。 再回到主题上,说到人的三六九等,如果从财力水平分,中国的大部分家庭都在中下等区域(家庭年入20万人民币以下。)很多中国家庭至今可能年入一万元人民币我都是相信的。因为本文主要说的是婚配问题,富有阶级的婚配可能和中下阶级比起来,会有质的区别。所以暂不在本次的讨论之列。

Continue reading
Posted in Uncategorized | Tagged , , , , | 1 Comment

div块的问题

我们在进行前端布局时通常会用到div,而div用多了又会造成出现冗余css的情况。但如果减少使用div的话,出现兼容性问题排查问题又得从头开始。所以这里其实可以因人而异。如果是习惯用的可以多用div,这样当出现问题时,一般只需要在div作用区域内排查就会找到问题。不习惯用的可以直接在body体中定义区域。其实编程没有新手老手,大家都是从新手来的。选择自己喜欢的就好。

Posted in Uncategorized | Tagged , , , , | Leave a comment

php7下的filesize

在php下filesize是用来计算文件大小的函数,我们可以通过filesize(‘file’)的形式来确定一个文件的字节大小,通过/1024来精确KB,GB等单位。 比如计算一个文件取两位KB的大小实例为


echo round(filesize(basename($path))/1024,2).'KB';

但是实际上如果要计算自身时,也是可以直接取到值的,没有测试php5是不是这样,php7下计算自身默认给的单位给的是字节,所以这样也能得到字节准确结果。


echo filesize(basename($path)).'B'; //结果是正确文件字节大小。

完整的实例为


$path = 'c:\www\htdocs\index.php';
$path2 = 'c:\www\htdocs\index.html';
echo filesize(basename($path)).'B'; //结果是正确文件字节大小。
echo '------';
echo round(filesize(basename($path2))/1024,2).'KB'; //结果是KB大小。
Continue reading
Posted in php | Tagged , , , , , | 3 Comments

wordpress 提示错误问题

之前忙于其他事情,没有来得及看博客,偶然间发现访问提示 The site is experiencing technical difficulties. 网上查询给出的建议是删除插件目录里的所有插件? 后没敢轻举妄动,删掉了最后一个更新的插件重新安装,再次访问,发现正常。问题解决。

Posted in Uncategorized | Leave a comment

文件上传的前世今生

从开始到现在,文件上传其实都是一项正常功能。其最大的好处就是方便了文件类型信息的交互与传递,大大减轻了现代办公压力。但是,它也有一个悖端,那就是,如果是不怀好意的人上传了不应该上传的内容,就会造成结果的不可预料。这样,就衍生成了一个严重的安全威胁。所以,我们要对文件上传内容进行过滤。

先来看一下什么是上传表单

<form action="up.php" enctype="multipart/form-data" method="post">Add File: <input name="file" type="file" value="" />
<input type="submit" value="Submit" /></form>&nbsp;

<?php if(isset($_POST)) { foreach($_FILES as $k=>$v) {
foreach ($v as $k=>$v)
{
                  echo '<pre>';
          echo $k.'----'.$v;
          echo '</pre>';
}
}

}

得到的结果为

name—-aserasfsadfdf.txt

type—-text/plain

tmp_name—-D:\test\tmp\phpA677.tmp

error—-0

size—-377
Continue reading

Posted in php security | Tagged , , , , , | Leave a comment

php夺旗题探究

夺旗题在信息安全领域一般被称为CTF题,随着这几年各方对信息安全慢慢变得越来越重视,CTF也渐渐火了起来。今天就记录一下跟这个有关的东西。

场景: 下班前,看到同事在看一个CTF题。

代码如下

<?php
header('content-type:text/html;charset=utf-8');
require_once '../config.php';
function decode($data){
    $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128,'',MCRYPT_MODE_CBC,'');
    mcrypt_generic_init($td,'ydhaqPQnexoaDuW3','2018201920202021');
    $data = mdecrypt_generic($td,base64_decode(base64_decode($data)));
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    if(substr(trim($data),-6)!=='_mozhe'){
        echo '<script>window.location.href="/index.php";</script>';
    }else{
        return substr(trim($data),0,strlen(trim($data))-6);
    }
}
$id=decode($_GET['id']);
$sql="select id,title,content,time from notice where id=$id";
$info=$link->query($sql);
$arr=$info->fetch_assoc();
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>X公司HR系统V1.0</title>
<style>.body{width:600px;height:500px;margin:0 auto}.title{color:red;height:60px;line-height:60px;font-size:30px;font-weight:700;margin-top:75pt;border-bottom:2px solid red;text-align:center}.content,.title{margin:0 auto;width:600px;display:block}.content{height:30px;line-height:30px;font-size:18px;margin-top:40px;text-align:left;color:#828282}</style>
</head>
<body>
<div class="body">
<div class="title"><?php echo $arr['title']?></div>
<div class="content"><?php echo $arr['content']?></div>
</div></body>
</html>

拿到代码,就知道了CTF的第一步。 要想做这类的题目,读不了代码肯定是不行的。 所以我们知道了,做这类题目的首要条件就是得有一定的代码基础。

这段代码的意思是,封装了一个decode方法并且给了一个形参,在方法体内对形参进行处理,然后回到代码执行流程中,在给id变量赋值的时候,去应用这个方法,然后就把变量带入了sql query中。这里不是直接query的,通过link对象去访问的query方法,这个时候,获取的数据赋给info变量后,实际上还是一个object,然后再通过对象访问方式获取一组数据赋给变量arr。 这里,最终查出来的数据其实是这样的。

arr[

‘id’=>’0’;
‘title’=>’零’;
‘content’=>’我是0零零’;
‘time’=>’我可能是一个unix时间戳’;
]

所以,$arr[‘title’] 下标对应的是谁得到的自然就是谁的value。简单点理解就是,从数据库中查出来的是一些键->值对应的数据,查出来了之后又赋值给了变量arr, 我通过变量[‘键’],取出来的自然就是值了。

到这里,我们知道第二条件, 要想做这类的题目, 不仅会读代码,还需要了解代码中具体方法的含义。

关键点其实在这里

if(substr(trim($data),-6)!=='_mozhe'){
        echo '<script>window.location.href="/index.php";</script>';
    }else{
        return substr(trim($data),0,strlen(trim($data))-6);
    }

当只有满足else条件时, 才会return结果。 可以连贯起来看一下。 部分翻译成中文
Continue reading

Posted in php security | Tagged , , , , , | Leave a comment

Windbg分析蓝屏

在Microsoft官网下载Windows sdk安装windbg,安装后, ctrl+s 设置符号表(填入 srv*c:\mss*http://msdl.microsoft.com/download/symbols), 在minidump目录获取dump文件,使用windbg打开,稍等一会会自动得出问题结果。

Posted in Uncategorized | Tagged , , , , | Leave a comment

Java漏洞演示平台 BodgeIt试用

这里是下载地址:https://github.com/psiinon/bodgeit

总结来说,它是一款很好的Java环境下的漏洞学习环境,搭建起来也很简单。推荐使用虚拟机,最好自己搞实验,测试的时候,不要在本机操作(有可能带来意外风险。)

因为是Java,想要运行它,jdk肯定是必要的。jdk的下载地址在这里。

http://www.oracle.com/technetwork/java/javase/downloads/jdk10-downloads-4416644.html

现在官网最新的版本是jdk 10。

安装完jdk之后,需要配置一下系统环境变量,这个可以利用一下搜索引擎,自给自足。

jdk安装完毕后,需要安装tomcat。

https://tomcat.apache.org/download-90.cgi

根据系统类型自己选择

如果你打开localhot:8080后如期看到了同样的内容,说明Java运行环境已经妥当。 这里,只需要把源码跑起来就行。仔细想了一下,我没有把该环境用作其它,只是测试,于是直接把webapps目录下的ROOT文件夹删除。 将BodgeIt压缩包的root目录改成大写放置到webapps下,刷新,看到预期页面,说明环境已经可以了。

这里有一个要注意的是,演示环境不能放置在公网。 继续看。

当我在search中输入一段

 alert(1)

时发现,它弹出了一个窗口,这代表着,我的Javascript代码已经被执行。可以去代码里看一下,它究竟为什么要这个样子做捏?

<h3>Search</h3>
<font size="-1">
<%
String query = (String) request.getParameter("q");

if (request.getMethod().equals("GET") && query != null){
        if (query.replaceAll("\\s", "").toLowerCase().indexOf("<script>alert("xss")</script>") >= 0) {
                conn.createStatement().execute("UPDATE Score SET status = 1 WHERE task = 'SIMPLE_XSS'");
        }
   
%>
<b>You searched for:</b> <%= query %><br /><br />

</font>

search部分的代码是这样的,我们看到,它在通过getparameter取值后,下面只判断了提交方式和不为空,满足后看到下面只对指定字符串处理了空白,再往下看直接使用了模板取值方法 <%= query %> 获取了q value, 于是,这里我们可以使用任意javascript造成xss。

看到这里,问题来了,如何进行修复? 有以下几种办法

1. 通过apache commons的StringEscapeUtils.escapeHtml4(query)对参数进行处理,这里BodgeIt其实给提供了一个很好的实例

StringEscapeUtils.escapeHtml4(query).replaceAll(“‘”, “&#39”);

直接将query转义成实体

2. 通过str.replace();

这种存在缺陷,如果存在遗漏容易导致被绕过

所以一般都会采用组合过滤办法,比如,如果遇到了一个int型的xss,在通过escape进行处理后,输出前,还可以再次对数据类型进行判断,非int不输出。也是一种防御的办法。

继续看第二个xss

第二个xss是个留言本,我们在留言本中输入xss代码时,并没有如期看到弹出了框框,在开发者模式下观察,

<script></script>

消失了

去web目录下打开contact.jsp

    // Strip script tags, because that will make everything alright...
        comments = comments.replace("<script>", "");
        comments = comments.replace("</script>", "");
        // And double quotes, just to make sure
        comments = comments.replace(""", "");

观察后发现, 它应用了replace方法,对script标签进行了替换,这里因为是只处理了这一个标签,于是我们换成任意一种xss均可达到绕过的效果成功的看到了弹框,因为留言数据本身就是属于不含有特殊意义的文本数据,所以这里直接转义实体就可以,继续看第三处
Continue reading

Posted in java, Uncategorized | Tagged , , , , | Leave a comment