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. springMVC+redis+redis自定义工具类 的配置

    1. maven项目,加入这一个依赖包即可, <dependency> <groupId>redis.clients</groupId> <artifactI ...

  2. react中Fragment组件

    什么是Fragment?在我们定义组件的时候return里最外层包裹的div往往不想渲染到页面,那么就要用到我们的Fragment组件了,具体使用如下: import React, { Compone ...

  3. HDURomantic

    Problem - 1004 (hdu.edu.cn) 扩展欧几里得解决线性同余方程.先得到gcd的解,再恢复原解,因为知道通解的一般形式,所以通过模来得到最小正整数解.另一个可以通过相减,或者一样的 ...

  4. 大数据安全与RANGER学习和使用

    概述 再说ranger之前需要明白一下大数据的安全体系的整体介绍,安全体系其实也就是权限可控,先说说权限:权限管理的目标,绝对不是简单的在技术层面建立起用户,密码和权限点的映射关系这么简单的事,更重要 ...

  5. kafka时间轮的原理(一)

    概述 早就想写关于kafka时间轮的随笔了,奈何时间不够,技术感觉理解不到位,现在把我之前学习到的进行整理一下,以便于以后并不会忘却.kafka时间轮是一个时间延时调度的工具,学习它可以掌握更加灵活先 ...

  6. http://dl-ssl.google.com/android上不去解决方案

    转:https://blog.csdn.net/j04110414/article/details/44149653/ 一. 更新sdk,遇到了更新下载失败问题: Fetching https://d ...

  7. [STM32F10x] 利用定时器测量频率

    硬件:STM32F103C8T6 平台:ARM-MDk V5.11 原理 利用STM32F10x的定时器的捕获(Capture)单元测量输入信号的频率. 基本原理是通过两次捕获达到的计数器的差值,来计 ...

  8. 【刷题-LeetCode】240. Search a 2D Matrix II

    Search a 2D Matrix II Write an efficient algorithm that searches for a value in an m x n matrix. Thi ...

  9. 【刷题-LeetCode】123 Best Time to Buy and Sell Stock III

    Best Time to Buy and Sell Stock III Say you have an array for which the ith element is the price of ...

  10. 【记录一个问题】macos下使用opencl, clSetEventCallback不生效

    一开始的调用顺序是这样: enqueueWriteBuffer enqueueNDRangeKernel enqueueReadBuffer SetEventCallback 执行后主程序用getch ...