文件上传的前世今生

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

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

<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
继续阅读

发表在 php security | 标签为 , , , , , | 留下评论

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";';
    }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结果。 可以连贯起来看一下。 部分翻译成中文
继续阅读

发表在 php security | 标签为 , , , , , | 留下评论

Windbg分析蓝屏

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

发表在 Uncategorized | 标签为 , , , , | 留下评论

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")") >= 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均可达到绕过的效果成功的看到了弹框,因为留言数据本身就是属于不含有特殊意义的文本数据,所以这里直接转义实体就可以,继续看第三处
继续阅读

发表在 java, Uncategorized | 标签为 , , , , | 留下评论

随便写点跟测试有关的东西

1. androidmanifest.xml文件中,选项为false时也不一定代表组件是不可以利用的,比如socket场景。 (各种安全示例里写的全部是错误的。)

2. netstat -anb | grep listen 确认存在后,除了可以检测数据是否明文外,还可以往该地址的该端口发送超大数据确认是否存在溢出。

3. 高度封装后的url可以使用IDA的text search功能提取(ipk,ipa),指望内置http server前端返回locahost格式访问做url hidden甚至是安全防御,如果不对原地址做调用/访问控制和漏洞修复,你的策略就是失败的。
继续阅读

发表在 Android | 标签为 , , , , , | 留下评论

Windows下安装laravel

laravel是一款很好的php开发框架,现在官网的最新版为5.6,因为它依赖于composer,所以在使用laravel之前,要确保composer已经安装。要不然是没办法继续下一步的。

其实官方也提供了安装辅助文档,地址在这里。

https://laravel.com/docs/5.6

在辅助文档里看到,它对服务器端环境的要求是这样的:

PHP >= 7.1.3
OpenSSL PHP Extension
PDO PHP Extension
Mbstring PHP Extension
Tokenizer PHP Extension
XML PHP Extension
Ctype PHP Extension
JSON PHP Extension

为了省事,又因为只是测试使用,所以去下了个xampp。安装完成后,继续去安装composer(因为laravel依赖于它),安装composer需要php环境,如果已经安装,它会自动识别,所以一路下一步就可以。安装完后,cmd下输入composer,如果看到这个提示,说明安装成功了

继续安装laravel install
继续阅读

发表在 php, Uncategorized | 标签为 , , , , | 留下评论

Wireshark原生支持中文了

刚刚下载了一个新版的wireshark,发现直接支持中文了,以往看的这方面的材料都是英文界面,现在支持中文后,友好了很多像我这种英文不太好的小白,呵呵。 继续阅读

发表在 security | 标签为 , , , | 留下评论

php中的一个有关数组和判断的问题

PHP在比较中用 ==来比较值是否相等, 用 === 来比较值和类型是否相等。 但在现实条件中,可能会发生意外情况,这个是值得开发者注意的。

<?php

$flag = 'Wel come to home';
if($_GET['a'] != $_GET['b'])
{
    if(md5($_GET['a']) === md5($_GET['b']))
    {
        echo '007'.$flag;
    }
}

比如,程序员通过 ===比较值和类型并判断md5后的信息是否一致,一致后输出欢迎信息,直接给a和b赋值不一样信息的话,第一个条件满足,但是第二个条件又不满足了,所以这个时候可以利用数组和===的一个特性,a[] = 1; b[] = 2; 肯定是true的。 到了md5里面,因为a、b里面传入的都为array,所以均为NULL,

echo gettype(md5(array(‘1,2,3’)));//md5传入array结果为 NULL 继续阅读

发表在 php security | 标签为 , , , , | 留下评论

php web漏洞解读二

在网上看到了一篇有关web漏洞的文章,第三方大多为原文转载,这里做个解读备份。谢谢原作者。

这篇文章的标题为 远丰集团旗下CMS疑有官方后门

暂且不说后门定义是否准确,只看成因。

我下载了作者提供的解密后的代码,文件关键部分如下

if ($codelock_file == '') {
    echo "<font face='verdana' size='2'><br /><b>Error!</b> You cannot run codelock directly...</font>";
    die();
} else {}
$codelock_active_key="loveb2bbuilder";
@extract($_REQUEST);
error_reporting(E_ALL ^ E_NOTICE);
if ($codelock_act >= 1) {} else {
    @set_time_limit(240);
}
if ($codelock_enc == "") {
    $codelock_enc="codelock.php";
} else {}
if ($codelock_act >= 1) {
    $codelock_testsize=@filesize($codelock_filed/$codelock_enc);;
    if($codelock_testsize != $codelock_mastersize){
        @chmod("$codelock_filed/$codelock_enc", 0777);
        if (@copy ("$codelock_rfiled/$codelock_enc","$codelock_filed/$codelock_enc")){
        }else{
            echo "$codelock_filed/$codelock_enc";
            $codelock_fp2 = @fopen("$codelock_filed/$codelock_enc", "wb");
            if ($codelock_fp2) {
            } else {
                @unlink($codelock_filed/$codelock_enc);
                $codelock_fp2 = @fopen("$codelock_filed/$codelock_enc", "wb");
            }
            if ($codelock_fp2) {
                @fwrite($codelock_fp2, $codelock_masterdata);
                @fclose($codelock_fp2);
            }
        }
        @chmod("$codelock_enc", 0777);
    }

粗略读过作者的文章之后发现,这是一篇介绍某CMS Getwebshell文章。 问题在把可控参数内容写入了文件中。 那么,就要去寻找它的成因。 继续阅读

发表在 php security | 标签为 , , , | 留下评论

如何正确的读网上的web漏洞分享文章(报告)

网上的漏洞分享报告很多,不管是文章也好报告也好,公开以后都是给人读的,最终目的都是让人受益。去了解,分析,研究,修复这个漏洞。但是读者群中不仅仅包括有厂商和漏洞研究者们,还有数目庞大的安全初学者和门外汉。

但是,在真正的拿起一篇文章开始读时,这些安全初学者往往会愕然,因为很多人会感觉无从读起,不好下手。为什么会有这种感觉呢?其实我猜应该是有以下几种原因导致的。

1. 安全研究者在发布漏洞时,往往只会注重技术细节,不会瞻前顾后。如果代码功底不强的读者看到了,肯定会云里雾里。

2. 漏洞公布平台版面/厂商要求? 不知道存在不存在这种情况,往往很多人喜欢一针见血, 不喜欢啰里八嗦的人,我曾经就被外甥训斥为:不要再啰嗦了。

3. 漏洞发布者是一个注重效率的人。

4. 初学者认为自己的问题太基础羞于下问,研究者认为问题太过基础耻于回答。(死循环)

于是这就导致了一个问题, 大多安全研究者认为此技术我已掌握不需要去过多了解,本来不会想去了解的人还是不会。 这样造成的结果就是,技术文章在有限的条件下偏离了造福一方的初衷。失去了安全的真正意义。 继续阅读

发表在 security | 标签为 , , , | 一条评论