wechall write up part 1

wechall 第一部分writeup 萌新入门求大佬赐教

Training: Get Sourced (Training)

右键查看源代码,拉到最下就可以看到答案

Training: Stegano I (Training, Stegano)

直接右键图片另存为,打开

Training: Crypto - Caesar I (Crypto, Training)

凯撒加密,找网站解一下即可,看清楚点交solution别把一整句话都交上去啦

Training: WWW-Robots (HTTP, Training)

大家可能一开始一脸懵逼连提交框在哪都找不到,其实hint就是提供的wiki页面介绍的知识。在网站的根目录一般会安放robots.txt文件用来提示网络爬虫什么该爬,什么不该爬。访问 http://www.wechall.net/robots.txt 就会发现一个禁止爬取的路径/challenge/training/www/robots/T0PS3CR3T/ 直接访问这个路径就可以啦

Training: ASCII (Training, Encoding)

ASCii值转字符,直接python写个小脚本

1
2
3
4
5
6
7
8
9
10
ASCiiList = [84,104,101,32,115,111,
108,117,116,105,111,110,
32,105,115,58,32,109,112,
115,108,114,112,104,101,
109,98,110,104]
str = ''
for ASCii in ASCiiList:
print (ASCii)
str += chr(int(ASCii))
print(str)

Encodings: URL (Training, Encoding)

URL编码,找网站解码,会给你一个URL,直接访问即可

Prime Factory (Training, Math)

找到两个大于100万的素数并且每个素数每一位相加的结果也是素数。思路很简单,先判断他本身是不是素数,然后把每一位遍历相加,再判断是不是素数,为了方便每一位相加,我把数字按字符串保存,然后用int()函数再转成数字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def (num):
for i in range(2, num // 2 + 1):
if num % i == 0:
return False
return True
num = '1000000'
count = 0
answer = ''
while True:
if IsPrime(int(num)):
SumNum = 0
for char in num:
SumNum += int(char)
if IsPrime(SumNum):
count += 1
answer += num
if count == 2:
print(answer)
break
num = str(int(num)+1)

Training: Encodings I (Training, Encoding)

这题是把ASCii转换成了二进制,然后7比特位一组转换成十进制的ASCii值再转换成字符就可以了,官方给的JPK可以帮助你完成这个操作,我是自己直接写了个小脚本。

1
2
3
4
5
6
7
8
9
10
11
12
binaryString = "101010011010001101001111001101000001110100110010111110001110100010000011010011110011010000001101110101101110001011010011110100010000011001011101110110001111011111100100110010111001000100000110000111100111100011110100111010010101110010000010110011101111111010111100100100000111000011000011110011111001111101111101111111001011001000100000110100111100110100000110010111000011110011111100111100111110100110000111100101110100110010111100100101110"
count = 0
string = ""
finallString = ""
for char in binaryString:
count += 1
string += char
if count == 7:
count = 0
finallString += chr(int(string,2))
string = ""
print (finallString)

Training: Programming 1 (Training, Coding)

1.337s之内返回,不知道有没有手快的大手子能手动搞定,我这个老年帕金森还是找py霸霸帮我吧

脚本就是收到返回值再发出去,记得抓下自己的cookies放上去。

1
2
3
4
import requests
cookies = {'WC':''}
response = requests.get("http://www.wechall.net/challenge/training/programming1/index.php?action=request",cookies = cookies)
requests.get("http://www.wechall.net/challenge/training/programming1/index.php?answer={}".format(response.text),cookies = cookies)

Training: Regex (Training, Regex)

贴个学习链接 https://github.com/ziishaned/learn-regex/blob/master/README-cn.md ,正则表达式这东西还是靠多用才能记住。多练多查别死记硬背。(说的我好像会了似得,逃~

level 1:/^$/头尾相接就是空串

level 2:/^wechall$/

level 3: 尝试1:/^wechall4?.(tiff|png|jpg|bmp)$/ 说我多了,然后尝试

/^wechall4?.(?:tiff|png|jpg|bmp|gif) $/正确

level 4:/^(wechall4?).(?:tiff|png|jpg|bmp|gif)$/

这里说一下()和(?:)的区别,实际上他们都能匹配上东西,不过()是捕获并返回,而(?:)只捕获不返回,因此level4为了返回将wechall4?放在了()中,而level 3因为只捕获不返回,所以我的尝试1出错

Training: PHP LFI (Exploit, PHP, Training)

(吐槽:每次打开全英文的页面点开翻译,然后看着像是不知道哪位火星老哥给我翻译的中文就有一种想去狂背单词的欲望呢嘻嘻。悔不当初悔不当初呜呜呜,对不起我各位美女英语老师)

简单说一下本地文件包含漏洞就是可以让用户自己控制访问的路径,访问服务器本地的其他文件。再这里说个最常见的技巧。因为很多网站访问文件是不用你提供后缀的,那么问题来了即使有LFI,我想访问.php你给我定了个.txt后缀可咋整啊。这就用的PHP经常使用的技巧%00截断。因为PHP内核是C语言实现的(所以世界上最好的语言其实是??),C语言的字符串结束符是%00,所以如果你人为的输入%00就会把%00后面的内容截断了。就可以访问任意类型文件了。

payload :file=../../solution.php%00

所以为啥返回了两层啊??我是瞎试试出来的..