SQL注入进阶练习(一)一些进阶的注入方法
SQL注入进阶练习
- 1. 二次注入
- 1.1 概念
- 1.2 sqllabs less-24
- 1.2.1 利用示例
- 1.2.2 原理剖析
- 1.3 网鼎杯2018 二次注入
- 1.3.1 环境搭建
- 1.3.2 解题思路
- 1.3.2.1 寻找源码 - git泄露数据恢复
- 1.git是啥
- 2.获取源码泄露的数据
- 1.3.2.2 源码分析
- 1.3.2.3 爆破登陆密码
- 1.3.2.4 实施二次注入获取flag
- 1.3.3 总结
- 2. 宽字节注入
- 2.1 概念
- 2.2 sqllabs less-33
- 2.3 字符编码引发的SQL注入问题
- 2.3.1 环境搭建
- 2.3.2 宽字节注入
- 2.3.3 GB2312与GBK的不同
- 2.3.4 mysql_real_escape_string 作为解决方案
- 2.3.5 宽字符注入的修复
- 2.3.6 iconv导致的致命后果
- 2.3.7 小结
- 3. order by 注入
- 3.1 什么是order by 以及order by 注入
- 3.2 注入类型的判断
- 3.3 注入方式
- 3.3.1 union联合查询
- 3.3.2 基于if语句的盲注(数字型)
- 3.3.3 基于时间的盲注 --- 无列名
- 3.3.4 基于rand()的盲注(数字型)--- 无列名
- 3.3.5 报错注入
- 3.4 总结
- 4. limit 注入
- 5. 总结
SQL注入的分类虽然大体上只有我们之前提到的那么几类,但真实的环境中又有一些"别样的“注入方案。例如二次注入、宽字节注入、order by注入、limit 注入。这些注入方式虽然不便于严格的按照分类进行划分,但是仅凭借着知名度就已经耳熟能详了。
本文将通过sqllab的一些例子以及部分CTF比赛试题,来对这几类注入方案进行一个详细的总结。
1. 二次注入
1.1 概念
二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。
作者:Ackerzy
链接:https://www.jianshu.com/p/3fe7904683ac
这一点其实还是和存储型XSS的攻击原理有些相似的,下main是一张攻击原理图,当然也是借用上面这位兄弟的。
下面我们就通过两个例子来对它进行演示。
1.2 sqllabs less-24
1.2.1 利用示例
我们先进行一波示例来看一看此类注入的利用方式。
我们先到注册界面注册一个账号:
username:user1
password:123123username:user1'#
password:123123
我们登陆user1'#
账号修改其密码为123456
测试直接使用123456
登陆user1的账号
登陆成功
1.2.2 原理剖析
但从上面的现象上我们能看出,我们新建了一个特殊名字的用户,在修改密码的时候修改了目标账号的密码。获取目标的账号。那么我们输入的单引号与注释符为什么没有在第一次进入数据库的时候生效,反而在我们进行密码修改的时候生效了呢?
我们需要对其部分源码进行分析才能解释这一现象:
我们看到页面中程序的主要功能就是登陆,新建用户,密码修改。我们主页面查看源码:
#登陆页面function sqllogin(){#调用了mysql_real_escape_string函数进行了参数过滤$username = mysql_real_escape_string($_POST["login_user"]);$password = mysql_real_escape_string($_POST["login_password"]);$sql = "SELECT * FROM users WHERE username='$username' and password='$password'";$res = mysql_query($sql) or die('You tried to be real smart, Try harder!!!! :( ');$row = mysql_fetch_row($res);//print_r($row) ;if ($row[1]) {return $row[1];} else {return 0;}}
关于过滤函数的解释:
我们再次查看注册部分的功能代码:
//$username= $_POST['username'] ;$username= mysql_escape_string($_POST['username']) ;$pass= mysql_escape_string($_POST['password']);$re_pass= mysql_escape_string($_POST['re_password']);echo "<font size='3' color='#FFFF00'>";$sql = "select count(*) from users where username='$username'";$res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( ');$row = mysql_fetch_row($res);
依然进行了过滤,直到我们查看我们的密码修改功能实现源代码:
if (isset($_POST['submit']))
{#从session中取出用户名,注意这里不加任何过滤$username= $_SESSION["username"];$curr_pass= mysql_real_escape_string($_POST['current_password']);$pass= mysql_real_escape_string($_POST['password']);$re_pass= mysql_real_escape_string($_POST['re_password']);if($pass==$re_pass){ #直接使用uodate进行数据的修改,也就是说我们的恶意用户名在此处会被带入语句执行#恶意修改正常用户的密码,造成账号泄露$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";$res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( ');$row = mysql_affected_rows();echo '<font size="3" color="#FFFF00">';echo '<center>';if($row==1){echo "Password successfully updated";}else{header('Location: failed.php');//echo 'You tried to be smart, Try harder!!!! :( ';}}else{echo '<font size="5" color="#FFFF00"><center>';echo "Make sure New Password and Retype Password fields have same value";header('refresh:2, url=index.php');}
}
?>
看到这里大概就已经清晰了,我们第一次注册账号存入的数据被转义,从而无法在登陆或者创建账号的过程中引发注入。但是我们再次从数据库中取出对应数据的时候,并未对其进行再次转义,导致取出了单引号一类的恶意字符。引发二次SQL注入。
这里还有一个疑点就是mysql_real_escape_string
函数的生效时间,它的转义持续时间明显是没有超过数据库入库的。也就是说,仅仅在程序执行的时候我们的敏感字符会被转义,而最终存储到数据库内部的字符还是如先前一样没有任何过滤措施。我们查看数据库内的信息就可以看到:
所以才会出现我们的敏感字符再次从数据库取出来的时候依然生效引发了二次SQL注入。
到了这里,二次注入的原理就十分清晰了,从数据库取出的用户输入,同样具有危险性。
1.3 网鼎杯2018 二次注入
1.3.1 环境搭建
这道题的环境我们需要到github上面进行拉取。
git网站位置:https://github.com/CTFTraining/wdb_2018_comment
#1.将文件解压到服务器上边
[root@blackstone batman]# unzip wdb_2018_comment-master.zip#2.修改该docker配置文件中的yml文件监听所有IP地址(否则外网无法访问)
[root@blackstone wdb_2018_comment-master]# cat docker-compose.yml
# 网鼎杯 2018 Comment
version: "2"services:web:image: ctftraining/wdb_2018_commentrestart: alwaysports:- "0.0.0.0:8307:80"environment:- FLAG=flag{flag_test}#3.启动docker环境
[root@blackstone wdb_2018_comment-master]# docker-compose up -d
访问目标网址的8307
端口看到留言板的界面就算环境搭建成功了。
1.3.2 解题思路
大体的思路就是通过目录扫描器看一看目标站点是否存在git泄露问题。当我们拿到目标站点的部分源码时可以通过对源码的代码审计获取目标站点的一些漏洞信息。或许能找到可供我们利用的漏洞点。
我们先使用dirsearch对目标站点进行目录扫描:
┌──(root
SQL注入进阶练习(一)一些进阶的注入方法相关推荐
- SQL语法之排序查询(进阶3)and常见函数(进阶4)
SQL语法体系学习笔记 SQL语法之基础查询(进阶1)and条件查询(进阶2) SQL语法之排序查询(进阶3)and常见函数(进阶4) SQL语法之分组函数,分组查询(进阶5)and连接查询(sql9 ...
- SQL语法之基础查询(进阶1)and条件查询(进阶2)
SQL语法体系学习笔记 SQL语法之基础查询(进阶1)and条件查询(进阶2) SQL语法之排序查询(进阶3)and常见函数(进阶4) SQL语法之分组函数,分组查询(进阶5)and连接查询(sql9 ...
- SQL Server AlwaysON从入门到进阶(1)——何为AlwaysON?
本文属于SQL Server AlwaysON从入门到进阶系列文章 本文原文出自Stairway to AlwaysOn系列文章.根据工作需要在学习过程中顺带翻译以供参考.系列文章包含: SQL Se ...
- SQL Server AlwaysON从入门到进阶(6)——分析和部署AlwaysOn Availability Group
本文属于SQL Server AlwaysON从入门到进阶系列文章 前言: 本节是整个系列的重点文章,到现在,读者应该已经对整个高可用架构有一定的了解,知道独立的SQL Server实例和基于群集的S ...
- SQL Server AlwaysON从入门到进阶(3)——基础架构
本文属于SQL Server AlwaysON从入门到进阶系列文章 前言: 本文将更加深入地讲解WSFC所需的核心组件.由于AlwaysOn和FCI都需要基于WSFC之上,因此我们首先要了解在Wind ...
- SQL Server AlwaysON从入门到进阶(2)——存储
本文属于SQL Server AlwaysON从入门到进阶系列文章 前言: 本节讲解关于SQL Server 存储方面的内容,相对于其他小节而言这节比较短.本节会提供一些关于使用群集或者非群集系统过程 ...
- sql 数据库前两列值乘_SQL注入原理和方法汇总
本文首发于先知社区 前言: SQL注入是web安全中最常见的攻击方式,SQL注入有很多方法,但如果只知道payload,不知道原理,感觉也很难掌握,这次就总结一下我所遇到的SQL注入方法,原理分析+题 ...
- 【SQL注入】通过实战教你手工注入MySql数据库
[SQL注入]通过实战教你手工注入MySql数据库 Hello,各位小伙伴们大家晚上好~~ 不知不觉,已经是本公众号的第八篇技术文章了,你们都有认真阅读吗? 正当小编发愁下一篇写什么的时候,鲁迅发话了 ...
- SQL注入教程——(四)宽字节注入
前言 在mysql中,用于转义(即在字符串中的符号前加上"\")的函数有addslashes,mysql_real_escape_string,mysql_escape_strin ...
- SQL注入教程——(三)简单的注入尝试
本文将以简单的SQL注入实例来讲解SQL注入的基本思路与流程,当然本文实例只是注入的一种情况,初学者应重点理解思路,学会举一反三. GET与POST 进行SQL注入攻击,大家还需要了解两种基本的 HT ...
最新文章
- linux更改文件夹权限_Linux 一些重点知识,整理的很全面,有必要收藏
- 大白话聊聊 Kafka 的架构原理和网络设计,它的性能高在什么地方?
- centos安装mysql wsl_在 Windows Linux 子系统中安装 CentOS
- rest-framework 视图
- 《编程题》找出数组中出现次数超过一半的数(时间复杂度O(n),空间复杂度为O(1))
- Daily Scrum02 12.04
- 免安装Mysql在Mac中的神坑之Access denied for user 'root'@'localhost' (using password: YES)
- 让别人和自己看懂自己的程序代码?一文掌握Java单行多行、文档注释以及注解(Annotation)超详细的理解使用,IDEA注释注解快捷键和模板,提高程序代码更有可读性
- Objective-C超高精度的计时器
- Apache Spark 2.2.0 中文文档 - Spark RDD(Resilient Distributed Datasets)
- 事关Animation Tree的工作随笔(一)
- excel函数调用其他sheet单元格
- Java LocalTime
- Power Query M语言日期时间函数(Date、DateTime、DateTimeZone、Duration)分类汇总,快速掌握
- MATLAB从入门到精通 第1章 MATLAB入门
- 23王道——中序线索树
- python pipe_Python os.pipe()用法及代码示例
- Creo9.0 绘制中心线
- LeetCode不浪费原料的汉堡制作方案
- 知识图谱系列-2-知识图谱发展历程及其分类
热门文章
- 如何做一个高级的文本编辑器 textarea,拥有快捷键操作
- Oracle中索引的创建和使用
- 非煤矿山生产安全事故应急预案
- 2023年4月应急预案演练、应急处置知识
- Xavier 下GMSL相机ROS驱动发布CompressedImage消息(基于NVJPG硬件编码)
- 变频电源是否要加功率补偿器?为什么?
- 基于体素化方法的点云降采样
- 处理 Code:516. Authentication failed: password is incorrect or there is no user with such name.
- 多媒体计算机的图像包括,多媒体计算机常用的图像包括什么
- java大写英文字母_输出一个字符串中的大写英文字母数,小写英文字母数以及非英文字母(.java)...