Page-1(Basic Challenges)

Less 1-4

Less-(1-4)是最常规的SQL查询,分别采用单引号闭合、无引号、括号单引号闭合、括号双引号闭合,没有过滤;可以采用and '1'='1的方式闭合引号,或注释掉引号来执行SQL语句。也可以使用报错注入。

Less 5-6

Less-5为盲注,即我们不能直接看到查询的返回结果,只能看到“查询成功”或“查询失败”,在sqli-labs中是以“You are in...”或无回显的形式来表明查询成功和失败,通常遇到的盲注形式是正常返回页面/错误显示页面。对于有回显的盲注,使用报错函数来注入也是一个思路,这就需要积累一些报错公式。

@@version MySQL的版本信息

@@datadir MySQL的安装路径

and extractvalue(1,concat(0x7e,(select @@version),0x7e))
and (updatexml(1,concat(0x7e, (select @@version),0x7e),1))
and (extractvalue(1,concat(0x7e,(select @@version),0x7e)))
and (select 1 from (select count(*),concat(floor(rand(0)*2),(select (select(select @@version)) from information_schema.tables limit 0,1))x from information_schema.tables group by x)a)

继续说盲注,我们无法直接看到查询结果,那么我们的思路便是传入一个判断语句,询问服务器某某字段的某个字母是否等于a?是否等于b?是否等于c?……以此来判断字段的名称,所以我们还需要截断字符串的函数,可以选择的有:left(a, b)从左侧截取a的前b位、substr(a,b,c)从b开始截取字符串a,长度为c、mid(a,b,c)从b位置 开始截取a字符串,长度为c。仅仅知道如何截取也是不够的,还需要知道如何查询字段的长度length(database())。可以是left(database(),1)>'s'的形式,也可以是ascii(left(database(),1))>115的形式。对于盲注,手工注入是很繁琐的,因此大多使用Python脚本来进行盲注。

payload:?id=1' and substr(database(),1)>'s' and '1'='1

上面的盲注思路是构造判断,观察页面的返回异同。SQL中有一个sleep()函数,可以让服务器“沉睡”一段时间,构造判断语句执行sleep,根据页面返回时间的长短来确定语句是否为真。

Less-6与Less-5的区别在于前者采用双引号闭合,后者采用单引号闭合。

Less 7

本关需要用到SQL语句中的select XX into outfile '路径'将查询结果导出为一个文件。一般用来写入一句话木马,再连接shell获取服务器的权限。

payload:?id=0')) union select 1,2,'shell' into outfile 'C:\\phpStudy_new\\WWW\\1.php' --+

这里的shell,可以是一句话木马,也可以是要查询的内容,这样访问生成的文件就可以获得查询的结果了。

Less 8

布尔盲注,与Less-5的区别是不会显示SQL查询的错误信息。

payload:http://192.168.137.130/sqli-labs/Less-8/?id=1%27%20and%20substr(database(),1)%3E%27s%27%20and%20%271%27=%271

Less 9-10

这一关无论什么样的查询,什么页面返回都不会报错,起初很好奇这是如何做到的呢?看过源码后发现在判断查询成功失败的if语句中,if和else里面都是“You are in...”,因此不管是否查询成功,返回的都是成功。于是布尔盲注不能用了,可以考虑基于时间的盲注。下面的payload中正确的时候会直接返回,错误则会等待5秒。

Less-10将单引号闭合改为了双引号闭合。

payload:?id=1'and If(ascii(substr(database(),1,1))=115,1,sleep(5))--+

Less 11-12

开始进入POST类型的注入,这一关中的用户名和密码均存在注入点,单引号闭合的布尔注入。由于存在报错回显,也可以使用报错注入。

关于“万能密码”的原理,万能密码1' or '1'='1,用户名可以存在或者随意,查看此时的SQL查询语句SELECT username, password FROM users WHERE username='2' and password='2' or '1'='1' LIMIT 0,1,or连接的1=1永远为真,故该查询将直接返回users表中的第一条记录。

同时,采用--+的注释是因为在方式为GET的参数传递过程中,--+为注释符--的URL编码。在POST类型的注入中不能使用,应该使用#注释掉后续语句或采用闭合引号的方式。

Less-12与Less-11的区别在于闭合方式为")

Less 13-14

在Less-13中,即使登录成功也无法看到回显信息,意味着需要进行盲注,因为成功与失败返回的是图片是不一样的,因此布尔盲注可以行得通。存在数据库查询报错信息回显,因此也可以使用报错注入。

Less-14与13的区别在于Less-14使用双引号闭合。

Less 15-16

单引号闭合,没有报错回显,没有查询回显,因此报错注入不能使用,可以采用布尔盲注和延时注入。

Less-16与15的处理方法类似,闭合方式改为")

Less-17

这一关是一个修改密码的界面,跟前面的不太一样了。前面的关往往都是查询用户的相关信息,用的是SQL的查询语句select ... from ... ,查看源码,这里首先执行了查询语句@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";,如果查询成功,再执行更新表中密码的语句$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";

对传入的用户名参数经过了check_input()函数的处理。

function check_input($value)
{
if(!empty($value))
{
// truncation (see comments)
$value = substr($value,0,15);
} // Stripslashes if magic quotes enabled
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
} // Quote if not a number
if (!ctype_digit($value))
{
$value = "'" . mysql_real_escape_string($value) . "'";
} else
{
$value = intval($value);
}
return $value;
}

check_input首先判断参数是否为空,若为空将其转换为整型,即若为空返回0。若非空,则只保留参数的前15位。然后检测magic_quotes_gpc是否开启,若开启,则返回去除转义符的字符串。接着进行一个纯数字检测,若果不是纯数字,则将SQL语句中使用的特殊字符转义并在两端添加一个单引号。

magic_quotes_gpc若开启,则会将GET、POST、COOKIE传递来的特殊字符添加转义符“\”。check_input()中,有一步检测该参数是否开启,若开启,将转义符去掉,起初很是疑惑为什么要将用来转义的\去掉,后面看到了mysql_real_escape_string()才明白,该函数针对在SQL语句中将引起歧义的特殊字符进行过滤,“\”的存在反而会引起歧义。

虽然对用户名进行了过滤,但是密码并没有做任何处理。新密码以单引号闭合,报错信息有回显,因此可以采用报错注入,但是要注意需要输入正确的用户名才可以进行注入。

除了报错注入,堆叠注入理论上也是行得通的,不过在实际测试中没有成功,将更新的SQL语句显示出来后,在命令行里执行该SQL语句却可以将shell导出。堆叠注入,即是利用分号将SQL语句分隔开,从而执行不同的SQL语句。

Less 18-19

18关主要告诉我们http的请求头也可以存在注入点,抓包后修改user-agent,与前面的用户名、密码的注入并无二致。19关注入点在referer上,类同。

Less 20-22

在20关这里,开启了一个新的环境。这里首先需要登录,在登录时用户名和密码都经过了check_input()的处理,登录后获取cookie,若cookie未删除且未过期时,服务器会首先检查cookie中的uname是否设置,然后执行查询,于是cookie中的uname字段便可以进行注入。

$sql="SELECT * FROM users WHERE username='$cookee' LIMIT 0,1";
$result=mysql_query($sql);

另外cookie中的uname以明文显示且与用户名相同,刷新页面修改uname字段的值为其他用户可导致水平越权。

在21关中,将uname进行了base64加密,处理方式类同。

22关在21关的基础上修改了uname参数的闭合方式,在21关中以')闭合,22关中以双引号闭合。

sqli-labs 1-22关的更多相关文章

  1. SQL注入系列:SQLi Labs

    前言 关于注释 说明:在SQL中--[空格]表示注释,但是在URL中--空格在发送请求的时候会把最后的空格去掉,所以用--+代替,因为+在被URL编码后会变成空格 MYSQL有三种常用注释: --[空 ...

  2. Sqli labs系列-less-3 。。。

    原本想着找个搜索型的注入玩玩,毕竟昨天被实力嘲讽了 = = . 找了好长时间,我才发现,我没有 = = ,网上搜了一个存在搜索型注入的源码,我看了好长时间,楞没看出来从哪里搜索注入了....估计是我太 ...

  3. Sqli labs系列-less-2 详细篇

    就今天晚上一个小插曲,瞬间感觉我被嘲讽了. SQL手工注入这个东西,杂说了吧,如果你好久不玩的话,一时说开了,你也只能讲个大概,有时候,长期不写写,你的构造语句还非常容易忘,要不我杂会被瞬间嘲讽了啊. ...

  4. Sqli labs系列-less-1 详细篇

    要说 SQL 注入学习,网上众多的靶场,就属 Sqli labs 这个系列挺不错的,关卡达到60多关了,我自己也就打了不几关,一个挺不错的练习SQL注入的源码. 我一开始就准备等我一些原理篇总结完了, ...

  5. SQLI LABS Basic Part(1-22) WriteUp

    好久没有专门练SQL注入了,正好刷一遍SQLI LABS,复习巩固一波~ 环境: phpStudy(之前一直用自己搭的AMP,下了这个之后才发现这个更方便,可以切换不同版本的PHP,没装的小伙伴赶紧试 ...

  6. Sqli labs系列-less-4 这关好坑!!!

    这章,可能我总结开会比较长,图比较多,因为,我在做了一半,走进了一个死胡同,脑子,一下子没想开到底为啥.... 然后我自己想了好长时间也没想开,我也不想直接就去看源码,所以就先去百度了一下,结果一下子 ...

  7. SQLI LABS Challenges Part(54-65) WriteUp

    终于到了最后一部分,这些关跟之前不同的是这里是限制次数的. less-54: 这题比较好玩,10次之内爆出数据.先试试是什么类型: ?id=1' and '1 ==>>正常 ?id=1' ...

  8. Sqli labs系列-less-5&6 报错注入法(下)

    我先输入 ' 让其出错. 然后知道语句是单引号闭合. 然后直接 and 1=1 测试. 返回正常,再 and 1=2 . 返回错误,开始猜表段数. 恩,3位.让其报错,然后注入... 擦,不错出,再加 ...

  9. Sqli labs系列-less-5&6 报错注入法(上)

    在我一系列常规的测试后发现,第五关和第六关,是属于报错注入的关卡,两关的区别是一个是单引号一个是双引号...当然我是看了源码的.... 基于报错注入的方法,我早就忘的差不多了,,,我记的我最后一次基于 ...

  10. Sqli - Labs 靶场笔记(一)

    Less - 1: 页面: URL: http://127.0.0.1/sqli-labs-master/Less-1/ 测试: 1.回显正常,说明不是数字型注入, http://127.0.0.1/ ...

随机推荐

  1. linux7,一台物理机上使用VM装多个虚拟机,始终只有一个虚拟机网络正常,其他虚拟机报错Error: Connection activation failed: No suitable device found for this connection.

    今天在VM新装了一个虚拟机,结果发现原来的虚拟机连不上了,重启网络服务后报错 Error: Connection activation failed: No suitable device found ...

  2. jsp文件中文乱码解决

    文件顶加上 <%@ page contentType="text/html;charset=UTF-8" language="java" %>即可

  3. ajax 异步 提交 含文件的表单

    1.前言 需求是使用 jquery 的 ajax 异步提交表单,当然,不是简单的数据,而是包含文件数据的表单.于是我想到了 new FormData() 的用法, 可是仍然提交失败,原来是ajax的属 ...

  4. 基于springboot的定时任务实现(非分布式)

    1. 核心注解 在springboot项目中我们可以很方便地使用spring自己的注解@Scheduled和@EnableScheduling配合来实现便捷开发定时任务. @EnableSchedul ...

  5. k8s的应用包管理工具helm的部署和使用

    1.概述 我们一般是在k8s里面部署一些简单的应用,比如用deployment,daemonset,statefuleset的方式来部署应用,但是如果要部署一些复杂的应用,那么整个配置的编写.部署的过 ...

  6. 极简promise雏形

    function Promise(fn) { var value = null, callbacks = []; //callbacks为数组,因为可能同时有很多个回调 this.then = fun ...

  7. 前端——JSON学习总结

    学习网址: https://www.bilibili.com/video/BV1Pt411u7R3 什么是JSON?(以下有关概念内容为视频中学习文档相关内容,代码为本人学习时使用的有关代码) JSO ...

  8. P3224 [HNOI2012]永无乡 题解

    P3224 [HNOI2012]永无乡 题解 题意概括 有若干集合,每个集合最初包含一个值,和一个编号1~n.两个操作:合并两个集合,查询包含值x的集合中第k大值最初的集合编号. 思路 维护集合之间关 ...

  9. 获取nginx日志状态码百分比脚本

    #!/bin/bash pwd=/app/nginx/logs/access.log for num1 in `cat $pwd | awk '{print $9}' | grep -Ei " ...

  10. 源码安装gitlab

    GitLab服务构成 GitLab由以下服务构成:   nginx:静态Web服务器 gitlab-shell:用于处理Git命令和修改authorized keys列表 gitlab-workhor ...