前言

SQL注入是web安全中最常见的攻击方式,SQL注入有很多方法,但如果只知道payload或只用用sqlmap,不知道原理,感觉也很难掌握,这次就总结一下我所遇到的SQL注入方法,原理分析+题目实战。

  1. Xpath报错注入

涉及函数

updatexml(): 对xml进行查询和修改

extractvalue():对xml进行查询和修改

1.报错语句构造

select extractvalue(1,concat(0x7e,user(),0x7e));

select updatexml(1,concat(0x7e,version(),0x7e),1);

原理分析

extractvalue(xml_str , Xpath) 函数,按照Xpath语法从XML格式的字符串中提取一个值,如果函数中任意一个参数为NULL,返回值都是NULL。

其实就是对XML文档进行查询的函数,相当于HTML文件中用

等标签查找元素一样,第一个参数传入目标xml文档,第二个参数使用Xpath路径法表示的查找路径

updatexml()函数与extractvalue()类似,是更新xml文档的函数

updatexml()函数有三个参数,分别是(XML_document, XPath_string, new_value)

第一个参数:XML_document是String格式,为XML文档对象的名称 

第二个参数:XPath_string (Xpath格式的字符串) 

第三个参数:new_value,String格式,替换查找到的符合条件的数据

题目实战

sqli-labs17关,涉及到xpath报错注入

uname尝试发现没有任何变化,尝试下passwd,发现单引号报错,且有报错信息,可以使用xpath报错注入 尝试下爆出数据库

uname=admin&passwd=1' or updatexml(1,concat(0x7e,database(),0x7e),1)# &submit=Submit

既然xpath报错注入可以,那就来一一爆出表、字段、值即可

2. 宽字节注入

涉及函数

addslashes() 函数返回在预定义字符之前添加反斜杠的字符串

mysql_real_escape_string() 函数转义SQL语句中使用的字符串中的特殊字符

mysql_escape_string() 转义一个字符串

原理分析

先了解一下什么是窄、宽字节已经常见宽字节编码:

一、当某字符的大小为一个字节时,称其字符为窄字节.

二、当某字符的大小为两个字节时,称其字符为宽字节.

三、所有英文默认占一个字节,汉字占两个字节

四、常见的宽字节编码:GB2312,GBK,GB18030,BIG5,Shift_JIS等

题目实战

http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%27

返回结果

发现被转义了,使用最经典的%df

?id=1%df' and 1=1%23

返回结果为:

%df和后面的\变成了一个汉字“运” ,所以单引号就可以不被转义,从而发挥闭合作用

爆出数据库,下面就很简单了,相当于知道了闭合符号,常用的payload更改一下即可

3. 叠堆注入

涉及字符

;,在SQL语句中用来表示一条sql语句的结束

原理分析

堆叠注入可以执行任意的语句,多条sql语句一起执行。在MYSLQ命令框中,常以;在位结束符,那我们边便可以在一句SQL语句结束后再紧跟一句SQL语句。

查询数据表

1';show databases;#

4. 二次注入

涉及函数

addslashes() 函数返回在预定义字符之前添加反斜杠的字符串

mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符

mysql_escape_string() — 转义一个字符串

二次注入原理

看到涉及到的函数是不是感觉很熟悉,这是因为大多数网站都会对用户输入的语句进行对特殊符号的过滤,例如:恶意用户构造的插入语句为1',经过这些函数的处理则变为1',这样便可以防止用户向服务器插入数据时引发的一些恶意操作,但这只是中途过滤了一下,最终返回到数据库里面的数据还是1',如果管理者对取出的数据没有进行进一步的检验处理,服务器从数据库取出恶意数据,未经过滤就直接拼接SQL语句进行查询,就会发生了SQL二次注入。

https://xzfile.aliyuncs.com/media/upload/picture/20191030191521-8fffd9ea-fb06-1.png

总结起来 二次注入其实是分为两个步骤:

  1.插入恶意数据
2.引用恶意数据

题目实战

SQL-labs24关便涉及到二次注入

注册用户源码

修改密码源码

我们先注册一个用户admin'#,密码设置为123,注册好之后查看一下数据库

注册成功,这时其实我们就可以修改管理员admin,为什么那,来看下修改密码的sql语句

我们用户名为admin'#,调用该用户时,SQL语句则变为了

我们将admin密码更改为123456,测试一下

更改成功,这便是二次注入的简单利用

从原理—实战分析SQL注入的更多相关文章

  1. web安全原理分析-SQL注入漏洞全解

    简介 靶场:榆林学院信息安全协会--入侵榆大实验靶场 数字型注入 1 字符型注入 1 布尔注入 1.布尔注入简介 mysql bool注入是盲注的一种.与报错注入不同,bool注入没有任何报错信息输出 ...

  2. [转载]mysql绑定参数bind_param原理以及防SQL注入

    假设我们的用户表中存在一行.用户名字段为username.值为aaa.密码字段为pwd.值为pwd.. 下面我们来模拟一个用户登录的过程.. <?php $username = "aa ...

  3. mysql绑定参数bind_param原理以及防SQL注入

    假设我们的用户表中存在一行.用户名字段为username.值为aaa.密码字段为pwd.值为pwd.. 下面我们来模拟一个用户登录的过程.. <?php $username = "aa ...

  4. 【攻防实战】SQL注入演练!

    这篇文章目的是让初学者利用SQL注入技术来解决他们面临的问题, 成功的使用它们,并在这种攻击中保护自己. 1.0 介绍 当一台机器只打开了80端口, 你最依赖的漏洞扫描器也不能返回任何有用的内容, 并 ...

  5. 什么是简单的分析SQL注入漏洞

    如今非常多人在入侵的过程中基本都是通过SQL注入来完毕的,可是有多少人知道为什么会有这种注入漏洞呢?有的会随口说着对于字符的过滤不严造成的. 可是事实是这样吗?我们学这些.不仅要知其然.更要知其所以然 ...

  6. [靶场实战]:SQL注入-显错注入

    SQL注入的本质:就是将用户输入的数据当作代码带入执行. 注入条件: 1.用户能控制输入 2.能够将程序原本执行的代码,拼接上用户输入的数据进行执行 首先检查是否存在注入点 Rank1: 构造语句 ? ...

  7. 【实战】SQL注入小脚本

    1.ORACLE布尔型盲注 import urllib import urllib2 import requests payloads = '_ABCDEFGHIJKLMNOPQRSTUVWXYZ' ...

  8. sql注入实例分析

    什么是SQL注入攻击?引用百度百科的解释: sql注入_百度百科: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具 ...

  9. sql注入攻防 以php+mysql为例

    随着Web应用的高速发展和技术的不断成熟,对Web开发相关职位的需求量也越来越大,越来越多的人加入了Web开发的行列.但是由于程序员的水平参差不齐或是安全意识太低,很多程序员在编写代码时仅考虑了功能上 ...

随机推荐

  1. Dockerfile优化——supervisor服务

    一.理解supervisor(supervisor服务不仅在容器中可用,在宿主机中也适用) 1.Dockerfile中的CMD可以指定启动容器后执行的第一个命令,但是当有多个服务进程需要启动的时候,就 ...

  2. JUnit5 快速入门指南

    1. 安装 在pom中添加依赖 <properties> <junit.jupiter.version>5.3.2</junit.jupiter.version> ...

  3. uniapp 获取用户手机号

    参考资料: 微信小程序官方文档 uniapp开发微信小程序获取用户手机号 页面增加一个按钮 <button open-type="getPhoneNumber" @getph ...

  4. python中模块与包

    #模块与包#在实际项目中,代码的行数可能上万,甚至上几十万,不可能在一个页面内完成,需要多个程序员通力写作#张三,李四,王五......每天收集大家的代码做一个版本,类似乐高积木一样,每个人负责一部分 ...

  5. HDU - 3790 最短路径问题 (dijkstra算法)

    HDU - 3790 最短路径问题 Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费 ...

  6. C# lambda 实现 Ascii 排序

    var dir = new Dictionary<string, string>();            dir.Add("channelId", "1& ...

  7. 【PHP】保留两位小数并向上取整

    问题: 一开始我想着数值*100然后向上取整然后再除以一百 $num = 1000 * 0.9634; echo $num; echo '</br>'; $res = ceil($num ...

  8. Navicat15 最新版本破解版操作步骤

    1.关于Navicat 15的安装版本以及破解机下载 分享的网盘连接:https://pan.baidu.com/s/12DaG0TmS9hXlYmJ_T5ytz2rA 提取码:7cg6 2.安装Na ...

  9. 一生挚友redo log、binlog《死磕MySQL系列 二》

    系列文章 原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 一生挚友redo log.binlog<死磕MySQL系列 二> 前言 咔咔闲谈 上期根据 ...

  10. javascript 享元模式 flyweight

    * 适应条件 ** 一个程序中使用了大量的相似对象 造成大的内存开销 ** 对象的大多数状态都可以变为外部状态 ** 剥离出对象的外部状态之后, 可以使用相对较少的共享对象取代大量对象 * 上传文件的 ...