bWAPP中SQL注入思路

SQL Injection (GET/Search)

等级:low

首先看看正常搜索的情况,这里我输入了一个字母b,可以看出来他把标题带有b的电影信息全都给搜出来了

在这里我猜想其构成SQL语句的代码:

$sql = "select * from table where Title like '%" . $name . "%'"

接下来为了验证猜想,我输入了一个单引号

返回了一个报错,直接证明了服务器未对单引号进行过滤,意味着我们可以使用单引号进行SQL语句的闭合控制,且也可以看出来后面带着一个%,和我们猜想的构成SQL的代码相差无几,而报错也是因为我们插入的单引号与前面的单引号匹配,导致语法出错造成的。

为了进一步验证是否存在注入,我们输入b%' and 1=1 #b%' and 1=2 #如果存在SQL注入的话,前者执行侯,返回的结果与直接输入b是一致的,后者则无法查询出任何信息。


结果与我们猜想的一致,说明这里的确存在SQL注入


证明了SQL注入存在,接下来就该搞些事情,比如查看数据库中的敏感信息。

于是我们就想到,如果我们能注入自己的select语句,那我们就能任意查看数据库中的敏感信息了。如何能执行我们自己的select语句呢?答案是用数据库中提供给我们的 union关键字,使用这个关键字可以进行联合查询,可以将复数的select数据合成一个数据集返回,我们使用union all,还可以将select仅仅进行简单的拼接后返回。

这样我们的进一步思路就是:
将原本的select查询结果变成空集,并union上我们自己的select,这样就可以返回我们想要的信息了。

但是新问题又来了:

  1. union关键字联结的两个select语句必须列数相同
  2. union关键字是否能使用

于是我们进一步着手解决这两个问题
对第一个问题,我们可以使用order by语句进行列数猜测。具体实现是,我输入如下信息给注入点b%' order by 7 #,这条语句的作用是,可以按照查询的第7列对数据进行排序,但是如果第七列不存在的话,则会返回错误。而这个临界点,就是查询结果包含的列数!

这样就可以证明,原本的select搜索出的结果包含7列数据。

接下来就是第二个问题,union关键字是否能使用。我们直接用于用看结果b%' and 1=2 union all select 1,2,3,4,5,6,7 #

这个结果是我们期望看到的结果了,union能用,而且我们可以看出来,第2,3,4,5列的数据会被直接打印在页面上,这样我们就可以在对应的位置上打印出我们想要的信息了。

接下来对mysql用户名主机名,当前数据库的版本信息,当前数据库名称,数据库路径等进行查询和显示。输入b%' and 1=2 union all select 1,user(),version(),database(),5,6,7#

查询当前数据库下的所有表信息b%' and 1=2 union all select 1,table_name,table_schema,database(),5,6,7 from information_schema.tables where table_schema=database() #

查询users表的所有字段名b%' and 1=2 union all select 1,column_name,table_schema,4,5,6,7 from information_schema.columns where table_name="users" #


等级:Medium

在中等防御下,单引号被转义,即不能使用单引号进行SQL语句的关闭控制

查看了一下后台的php代码,发现使用了addslashes()函数进行防御。

addslashes()函数会在指定的预定义字符前添加反斜杠转义,这些预定义的字符是:单引号(’)、双引号(")、反斜线(\)与 NUL(NULL 字符)。

虽然这个防御方法在某些场景下可以绕过(比如输入某个字符串需要用引号框住),但是在字符型SQL注入中,他的确会直接导致我们无法用单引号进行SQL语句的关闭控制。这点我们后面的实例会讲到。

等级:high

高等级防御使用了mysql_real_escape_string()函数,这个函数可以转义SQL语句中使用的字符串中的特殊字符
如:

\x00
\n
\r
\
'
"
\x1a

基本无法绕过


SQL Injection (GET/Select)

这次的SQL注入是一个数值型注入,猜想SQL赋值语句为

$sql = "select * from table where id=" .$id

等级low的与上面的类似,就不详述了,我们直接看等级为medium的

等级:medium

按照前一类注入的步骤,我们在地址栏直接写入payload,一路畅通无阻,直到查询表中字段名的时候发现执行失败

http://192.168.9.100/bWAPP/sqli_2.php?movie=3%20and%201=2%20union%20all%20select%201,column_name,table_schema,4,5,6,7%20from%20information_schema.columns%20where%20table_name="blog"&action=go


直接可以看出来,还是转义了双引号,但是这次的情况,我们就可以绕过,不需要双引号,可以达到同样的效果,payload如下

http://192.168.9.100/bWAPP/sqli_2.php?movie=3%20and%201=2%20union%20all%20select%201,column_name,table_schema,4,5,6,7%20from%20information_schema.columns%20where%20table_name=CHAR(98,108,111,103)&action=go

可以看到,我们使用了CHAR()函数对我们想要的字符串blog进行了输出,即CHAR(98,108,111,103)相当于"blog",直接绕过,以下是结果

等级:high

等级high的防护方法还是挺绝的…直接上后台代码分析吧

这里用的是php5后推出的mysqli相关方法,其中mysqli_prepare()函数里面把参数用’?'来替代,然后使用 bind_param() 绑定参数。在 bind_param() 中,第一个参数’s’代表了参数的类型与个数(此处为一个字符串类型)。他会根据参数个数格式化字符串,这样直接避免了我们扩展传入的参数从而执行恶意的SQL语句。


SQL Injection (Login Form/Hero)

这个叫做superHero的页面考察的是你能否在不知道用户名和密码的情况下,通过这个登录验证。

等级:low

整理一下思路:这里让我们输入了用户名和密码,在后台肯定会有相关的代码是对用户名和密码进行认证的。如何绕过这个认证就是我们这次要解决的问题。

(说实话这个用户名密码判断我是真的没猜到,想复杂了,以至于我直接上去看代码了,看完我人傻了…)

绕过方法就很简单了,直接用常用的“万能密码”' or 1=1 #就行,由于1=1是永真式,where中有逻辑运算符or,这样where语句就永真了

等级:medium/high

同之前的Search一样,对单引号转义了,无法控制’的关闭。


SQL Injection (Login Form/User)

其实一开始看这个页面,我是没有看出来它和上面那个Hero有什么区别,后来才知道,这个User登录的逻辑是我一开始在Hero那想的逻辑。大概就是先去数据库查出user_name对应的password,再与前端发来的password比对,比对通过则验证成功

等级:low

没想出来,直接看代码了。


这里可以看出来我们可以通过修改user_name的参数进行注入,但是返回的结果集中必须满足条件才可以进行输出。题出的听妙的,接下来我们构造一下注入。

思路:

首先我们要保证$row["login"]是存在的
其次我们要保证$row["password"]的值与我们前端填入的password再sha1加密下是一致的
接下来就是关键点union的用法,使用UNION关键字,是将两个结果集合并到一个结果集中,并且它会去掉重复的部分。还有一个问题是关于使用UNION关键字后的列名问题,在这里我们需要注意,如果叠加后的列名,我们没有使用AS子句将其变为相同的列名的话,那么,它会采取UNION关键字前Select语句中的字段名
用这个方法,在前面的搜索结果集为空的情况下,union上我们恶意的select语句,就可以直接变成恶意的$row,这样我们就能通过$row["login"]与$row["secret"]在页面打印出我们想要的信息了

思路有了,接下来就是如何确定返回的列数与$row[“password”]是第几列了

先做一个猜列数操作,这里我就直接说结果了,一共有九列' order by 10 #

接着,本着第一列一般是id的原则,我直接用枚举法试了一下password所在的列,还好运气不错,第三列就是password的所在位置,所以,我们构造如下注入语句' union select 1,2,'356a192b7913b04c54574d18c28d46e6395428ab',4,5,6,7,8,9 #
注:这里的密码栏应该输入1,因为注入语句中那一长串是1的sha1加密码,如果不想要1就自己构造加密码,网上有很多

注入成功,而且可以看出第二列和第五列可以直接打印出来,我们就可以获取数据库内容了

bWAPP中SQL注入思路相关推荐

  1. sql注入程序_Java应用程序中SQL注入

    sql注入程序 在本文中,我们将讨论什么是SQL注入攻击. 以及它如何影响任何Web应用程序使用后端数据库. 在这里,我专注于Java Web应用程序. 开放Web应用程序安全性项目(OWAP)列出了 ...

  2. java 防止sql注入_Java中SQL注入以及如何轻松防止它

    java 防止sql注入 什么是SQL注入? (What is SQL Injection?) SQL Injection is one of the top 10 web application v ...

  3. Pikachu(皮卡丘)靶场中SQL注入

    Pikachu靶场中SQL注入 1.Pikachu(皮卡丘)靶场中SQL注入 1.1.数字型注入 1.2.字符型注入 1.3.搜索型注入 1.4.xx型注入 1.5.insert/update注入 1 ...

  4. 关于ECSHOP中sql注入漏洞修复

    标签:ecshop sql注入漏洞修复 公司部署了一个ecshop网站用于做网上商城使用,部署在阿里云服务器上,第二天收到阿里云控制台发来的告警信息,发现ecshop网站目录下文件sql注入漏洞以及程 ...

  5. 安全测试中sql注入测试思路

    在找好需要测试的功能点之后,针对每种功能点(参数),sql注入测试一般遵循下面步骤: 1. 测试注入类型,数字型or字符型 如果参数中直接包含字母,那么直接可以判断是字符型参数,如id=4a. 若参数 ...

  6. BWAPP之SQL注入通关

    1.SQL injection(GET/search) low 输入单引号直接报错,说明有注入点 直接order by二分法得出主查询字段数为7 直接union注入,测出回显点为2,3,4,5 查数据 ...

  7. Mybatis中SQL注入攻击的3种方式,真是防不胜防!

    作者 | sunnyf 来源 | https://www.freebuf.com/vuls/240578.html 前言 SQL注入漏洞作为WEB安全的最常见的漏洞之一,在java中随着预编译与各种O ...

  8. CTF中SQL注入常见题型整理

    前言 SQL在CTF每一次比赛中基本上都会出现,所以有了这一篇总结,防忘. 简而言之:SQL注入用户输入的数据变成了代码被执行. 这一篇这要写的是sql注入中各种经典类型的案例.暂时只写这么一点,后面 ...

  9. 从PDO下的SQL注入思路到获得GIT 3000star项目0day

    0x01 PDO简介 PDO全名PHP Data Object PDO扩展为PHP访问数据库定义了一个轻量级的一致接口.PDO提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以使用相同的函 ...

最新文章

  1. Win7 64位的SSDTHOOK(2)---64位SSDT hook的实现
  2. spring gateway 限流持久化_Spring Cloud Gateway 扩展支持动态限流
  3. 深度学习中Flatten层的作用
  4. shell getopts
  5. 广播等风暴的解决办法
  6. SpringBoot Bean配置
  7. jbehave_使用JBehave,Gradle和Jenkins的行为驱动开发(BDD)
  8. [前台]---js中去掉双引号或者单引号
  9. django 1.8 官方文档翻译: 1-3-1 高级教程:如何编写可重用的应用
  10. 暗黑系游戏_暗黑系冒险游戏,剧情引人入胜!
  11. Oracle常用函数笔记
  12. java monitor 翻译_Java 对象锁与monitor的区别
  13. exchange 2010高可用平台的搭建和配置
  14. 【编程实践】复杂网络的基本知识及实现
  15. 网络安全实验3 使用PGP实现电子邮件安全
  16. python程序采用unicode编码、英文字符_python--基础字符编码
  17. 大学计算机习题汇总及答案
  18. AndroidStudio报错:Entry name ‘META-INF/androidx.legacy_legacy-support-core-utils.version‘ collided
  19. 使用Roslyn动态编译和执行
  20. 37来电号码归属地的显示

热门文章

  1. 让你爱不释手的Mac软件
  2. 【Tip】设计美化相关网站汇总(非专业)——制图、PS、格式调整等
  3. C语言union联合体中不同类型变量读取同一地址数据问题
  4. 电脑通过PPC WM5 WM6智能手机GPRS拨号上网方法
  5. net.if.in.dropped rx_missed_errors 丢包
  6. 冬天里有一种寒冷叫做妈妈觉得你冷,那么今天的你穿秋裤了吗?
  7. 接口json参数形式
  8. Linux之Ubuntu命令行常见命令
  9. 【npm】No matching version found for @abp/ng.components@~4.0.1.
  10. Android获取应用APP