漏洞重温之sql注入(五)
漏洞重温之sql注入(五)
sqli-labs通关之旅
填坑来了!
Less-17
首先,17关,我们先查看一下页面,发现网页正中间是一个登录框。
显然,该关卡的注入应该为post型。
直接查看源码。
首先,我们看到网页封装了一个check_input函数,在函数中,使用了mysql_real_escape_string函数对我们输入的内容进行转义,一般来说,在这么操作之后,sql注入基本无法完成。
然后我们看一下,网页对我们的哪些输入使用到了check_input函数。
查看下方代码:
$uname = check_input($_POST['uname']);
$passwd = $_POST['passwd'];
从上面代码中,我们可以看到,网页对我们输入的uname值进行了转义,对passwd没有,也就是说,我们可以将注入代码通过passwd参数完成注入攻击。
随后,我们关注下方代码:
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";
这条代码是网页向服务器发起的第一条请求。该请求是网页利用我们输入的uname参数从user表中查询username和password两条数据。
因为uname参数是无法用来进行sql注入的,所以这条语句我们无法利用。
接着往下看:
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
这两条是执行刚才的那条查询语句,并且将结果返回到$row参数中。
当然,如果我们是要进行注入的话,这两条也没用。
接着看:
if($row)
{
//echo '<font color= "#0000ff">';
$row1 = $row['username'];
//echo 'Your Login name:'. $row1;
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
mysql_query($update);
echo "<br>";
这是当uname查询成功之后,所执行的代码块,在这个代码块中,我们总算看到了自己能够利用的passwd参数。
但是由于这条语句使用的是UPDATE语句,所以我们没有办法直接利用这条语句查询出我们想要的内容。
重点在下面,我们看下面这个代码块:
if (mysql_error())
{
echo '<font color= "#FFFF00" font size = 3 >';
print_r(mysql_error());
echo "</br></br>";
echo "</font>";
}
这个代码块的意思就是,如果代码出现了错误,那么就使用print_r参数将报错信息打印到网页上。
也就是说,虽然我们没法利用update语句进行查询,但是我们却可以通过构造语句,使得数据库报错,然后通过上方的代码块,将我们想查询的数据返回到页面上。
这里,我使用的是updatexml函数进行报错注入。
pyload如下:
uname=admin&passwd=1' or updatexml(1,concat(0x7e,(select database()),0x7e),1) -- &sumbit=Sumbit
updatexml函数的报错注入,其实是有一种固定格式的,如果不想了解太深的话,只需要记住下面的格式,就可以使用了。
updatexml(1,concat(0x7e,(执行语句),0x7e),1)
而如果要理解的话,其实也很简单,updatexml函数是一个改变文档中符合条件的节点值的函数。而这个函数后面是有三个值的。
其实,第一个值简单来理解就是我们要查找内容的名称,第二个值是查找的内容,第三个是替换内容。
但是,第二个值是有固定格式的,如果格式不正确,就会导致报错。这也是可以使用updatexml函数进行报错注入的原理。
concat函数的目的是返回结果为连接参数产生的字符串,就是将我们代码执行成功之后的结果返回回来。
0x7e就是符号“~”。
当然,这里要注意的一点是,updatexml函数只能截取32位的数据,如果我们想要查询所有数据库名称的话,直接按照之前的方法是不行的。
例如:
那这样在实际情况中是不够的,因为数据不可能只有32位,所以,为了能查看到所有数据,我们可以使用limit函数来切割结果,一个一个的放出来,这样位置就够用了。
payload如下:
uname=admin&passwd=1' and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e),1) -- &sumbit=Sumbit
第十七关,通关。
当然,报错注入还是有其他的一些常用函数的,而且我的解释是从我的视角出发,针对对报错注入没有了解,想要了解更多的人而做的。如果想要更深入的了解,可以看下这位keefe大佬的这篇文章。
http://aiyuanzhen.com/index.php/archives/34/
Less-18
单从网页上看的话,第十八关似乎跟第十七关的区别不大,只是页面上多了一条ip address的显示。
我们直接查看源码,看这一关设置了什么难题。
这一关,是对于我们输入的uname参数和passwd参数同时使用check_input函数进行了转义,导致我们无法利用这两个参数进行sql注入攻击。
乍一看,似乎无懈可击,但不着急,接着往下看。
首先是最上面一条的sql语句,网页是判断了用户名和密码,都正确之后才会进入下面的If判断。
而我们可以利用的代码,就在这个里面。
首先我们先查看这段代码,他获取了我们的ua属性,所以在我们访问的时候,才会在网页上给出那段提示。注意,这个参数的获取,是没有被check_input函数转移的,也就是说,我们可以在这个参数里面插入sql语句进行注入攻击。
然后,我们看这个函数被利用到的语句。
$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
是insert语句,所以我们同样无法直接利用这条语句返回我们希望看到的结果。
不过,在这条语句下方,依然有print_r(mysql_error())这条语句。这条语句的功能是打印数据库报错信息,也就是说,我们依然可以选择使用报错注入获取我们希望得到的数据。
当然,因为我们需要在请求包的UA中插入代码,所以我们需要使用Burp进行抓包,来修改UA属性。
payload如下:
' or updatexml(1,concat(0x7e,(select databese()),0x7e),1) or '
这里要注意的一点是,因为网页是验证了用户名和密码之后才会执行我们插入代码的语句,所以想要利用这个注入点,就需要有系统的账户名和密码。
想要读取多条数据的方式,和十七关一样,使用limit函数将结果切割之后挨个输出就可以了。
第十八关,通关。
Less-19
直接看十九关的页面,发现跟十八关几乎一模一样,所以猜测过滤方式应该相同,直接看源码。
过滤果然一样,唯一不同的点是,之前的$uagent参数是从请求包中的ua属性中获取,而这19关是从referer获取。
也就是说,上一次我们需要在ua属性里面插入代码,这一次,我们需要在referer属性里面插入。
pyload一致,我就不写了,直接放图。
第十九关,通关。
Less-24
24关,看页面就能明显感觉跟之前的几个post型注入有区别,而且,可以看到在页面上多了忘记密码和新建用户两个选项。
很明显,这是一个二阶注入。
二阶注入呢,简单来理解是,我们没办法直接在页面插入sql语句,并且使其执行返回我们需要的结果。所以我们可以先把带有sql代码的语句插入到数据库里,当我们再次调取之前插入的数据的时候,就可以完成注入。
这关应该怎么破,我们直接看源码。
这关的文件很多,但是有用的就两个地方。
这段代码,就是我们新建用户的时候所调用的代码,首先我们可以看到,网页在接受我们输入的数据的时候,使用了mysql_escape_string函数将我们的输入进行了转义,然后将我们输入的用户名先在数据库中进行了一次查询。
这次查询的目的是看我们的用户名在数据库中是否重复,如果重复,提示我们更换用户名,如果不重复,就将我们的注册的用户名和密码写入到数据库中。
而这正是我们想要利用的地方。
然后,我们去看修改密码页面,因为我们无法通过该注入直接查询到我们希望查询到的数据,那就可以将某个用户的密码修改成我们已知的密码,这样也可以完成注入攻击。
这是修改密码位置的sql语句,可以看到,语句是使用单引号进行闭合的。
所以,如果我们想利用这条语句修改掉用户密码的话,我们在注册账户的时候,就需要使用单引号去闭合。
具体操作步骤如下,用户名我选择使用 admin1' or 1=1 -- 使用or连接符的话,就可以将系统中所有用户的密码在执行该命令的时候全部修改掉。
密码我选择123456.
出现这个页面,说明我们的用户创建成功,然后使用该账户进行登录。
登录成功后,发现网页的修改密码位置。
输入我们的用户名,使用密码12345.
点击修改之后,网页会出现如下页面。
这个时候,我们去数据库查看一下我们修改所有用户密码为12345的操作是否完成。
可以看到,密码已经都被修改为了12345。
第二十四关,通关。
Less-25
打开页面,网页提示输入id,确认该位置注入属于get型注入。
随后我们看到页面提示or和and不能使用了。
查看源码。
可以发现,该位置的确封装了一个函数将and和or过滤为空,但是因为是单词,而且这个过滤只进行了一次,所以我们只需要利用双写便可以成功的进行注入。
从上面的sql语句我们可以确定该位置闭合需要使用单引号。
pyload如下:
1' anandd 1=2 union select 1,version(),database() --
第二十五关,通关。
25a关,过滤跟25关一致。细微的差别在下图。
这里的id参数没有被任何符号包裹,所以想要构造攻击payload,只需要将上一关使用的payload的单引号和过滤符号删除就可以。
第25a关,通关。
漏洞重温之sql注入(五)的更多相关文章
- 漏洞重温之sql注入(六)
漏洞重温之sql注入(六) sqli-labs通关之旅 Less-26 进入第26关,首先我们可以从网页的提示看出本关是get型注入. 我们给页面添加上id参数后直接去查看源码. 需要关注的东西我已经 ...
- 漏洞重温之sql注入(七)
漏洞重温之sql注入(七) sqli-labs通关之旅 Less-31 首先,进入31关,我们先添加上id参数. 然后,我们查看源码. 我们门可以看到,index页面源码其实很简单,网页也没有对我们的 ...
- pikachu漏洞练习之sql注入
这里因为实验的时候只记录了一部分所以就展示一部分 1.1.1数字型注入 (1)看到界面发现是查询id功能,没有在url里看到有传参所以应该是post方法提交数据. (2)进行sql注入之前我们最好是先 ...
- DVWA漏洞演练平台 - SQL注入
SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,具体来说,它是利用现有应用程序将(恶意的)SQL命令注入到后台数据库引擎执 ...
- 【漏洞汇总】SQL 注入漏洞之 mysql
日期:2019-07-23 19:55:59 更新:2019-08-02 10:40:37 作者:Bay0net 介绍:Mysql 注入笔记 0x01. 基本信息 1.1 基本术语 数据库: 数据库是 ...
- SQL注入漏洞总结
目录: 一.SQL注入漏洞介绍 二.修复建议 三.通用姿势 四.具体实例 五.各种绕过 一.SQL注入漏洞介绍: SQL注入攻击包括通过输入数据从客户端插入或“注入”SQL查询到应用程序.一个成功的S ...
- SQL注入漏洞知识总结
目录: 一.SQL注入漏洞介绍 二.修复建议 三.通用姿势 四.具体实例 五.各种绕过 一.SQL注入漏洞介绍: SQL注入攻击包括通过输入数据从客户端插入或“注入”SQL查询到应用程序.一个成功的S ...
- Nikto是一款Web安全扫描工具,可以扫描指定主机的web类型,主机名,特定目录,cookie,特定CGI漏洞,XSS漏洞,SQL注入漏洞等,非常强大滴说。。。
Nikto是一款Web安全扫描工具,可以扫描指定主机的web类型,主机名,特定目录,cookie,特定CGI漏洞,XSS漏洞,SQL注入漏洞等,非常强大滴说... root@xi4ojin:~# cd ...
- WordPress WP-Realty插件‘listing_id’参数SQL注入漏洞
漏洞名称: WordPress WP-Realty插件‘listing_id’参数SQL注入漏洞 CNNVD编号: CNNVD-201310-499 发布时间: 2013-10-23 更新时间: 20 ...
随机推荐
- KMP算法图解
字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...
- PHP sizeof() 函数
实例 返回数组中元素的数目: <?php$cars=array("Volvo","BMW","Toyota");echo sizeof ...
- PHP is_scalar() 函数
is_scalar() 函数用于检测变量是否是一个标量.高佣联盟 www.cgewang.com 标量变量是指那些包含了 integer.float.string 或 boolean 的变量,而 ar ...
- layer.js : n.on is not a function
当时使用的jQuery为1.4.x的版本.换成高版本就好了. 参考 https://blog.csdn.net/marswill/article/details/69316003
- MyBatis-Plus使用(3)-条件构造器
说明: 以下出现的第一个入参boolean condition表示该条件是否加入最后生成的sql中 以下代码块内的多个方法均为从上往下补全个别boolean类型的入参,默认为true 以下出现的泛型P ...
- JVM系列之:从汇编角度分析Volatile
目录 简介 重排序 写的内存屏障 非lock和LazySet 读的性能 总结 简介 Volatile关键字对熟悉java多线程的朋友来说,应该很熟悉了.Volatile是JMM(Java Memory ...
- Flink中的window、watermark和ProcessFunction
一.Flink中的window 1,window简述 window 是一种切割无限数据为有限块进行处理的手段.Window 是无限数据流处理的核心,Window 将一个无限的 stream 拆分成有 ...
- Spring Boot 集成 Elasticsearch 实战
最近有读者问我能不能写下如何使用 Spring Boot 开发 Elasticsearch(以下简称 ES) 相关应用,今天就讲解下如何使用 Spring Boot 结合 ES. 可以在 ES 官方文 ...
- Java并发--基础知识
一.为什么要用到并发 充分利用多核CPU的计算能力 方便进行业务拆分,提升应用性能 二.并发编程有哪些缺点 频繁的上下文切换 时间片是CPU分配给各个线程的时间,因为时间非常短,所以CPU不断通过切换 ...
- C#LeetCode刷题之#724-寻找数组的中心索引( Find Pivot Index)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3742 访问. 给定一个整数类型的数组 nums,请编写一个能够返 ...