这是我真正意义上来说做的第一道SQL题目,感觉从这个题目里还是能学到好多东西的,这里记录一下这个题目的writeup和在其中学到的东西

link:https://www.ichunqiu.com/battalion Web分类下的SQL

尝试SQL注入

进入这个模拟环境之后,会得到一个提示为flag在数据库中,这时候查看url栏可以发现



嗯这个就有SQL注入内味了,然后试一下id=2或者id=3,发现id=2时候可以出来提示为test,然后再往后就什么都不出来了,这时候我先假装id后面的东西是一个数字变量,输入id=1 and 1=1,发现网页给出提示是这是SQL注入代码,这说明这个网站是有对SQL注入做基本的防护的,所以现在的问题就变成了如何绕过服务器的过滤规则。

对过滤or、and、xor、not的绕过

对这些的绕过一般的操作是

  • and = &&
  • or = ||
  • xor = | # 异或
  • not = !

    现在我们换一下把输入变成id=1 && 1=1,发现并没有报错,这说明我们成功进行了注入的第一步。这时候我们可以发现,很有可能该数据库仅对我们展示了表中某一列的数据,所以现在就要判断这个表到底有几列,这里使用的方法是order by。url里输入id=1 order by 1,报错提示这是sql注入代码,所以现在要进行进一步的绕过

SQL关键字过滤绕过

  • 改变大小写:例如select变为SELect(本题中没用)
  • 添加内联注释:把一些MYSQL的语句放在/*!...*/中,例如/*!order*/(本题中没用)
  • 双写关键字:一些waf中替换使用的是replace()函数,因此可以输入selselectect,在经过waf处理后变为select(本题中没用)
  • 空格过滤绕过:有些waf会过滤掉注入中的空格导致无法正常允许,这里可以把空格用/**/,反单引号,(),回车等进行代替(本题中暂时不用考虑)
  • 等号绕过:使用like和rlike模拟=的功能,在不添加通配符%时候,like xxxrlike xxx= xxx是等价的(本题中暂不用考虑)
  • 添加<>或者//:因为有的waf会对<>或//进行过滤,所里可以利用这一点,使用sel<>ect进行绕过(本题有用)

    现在进行分割,注意分割时候order不要分割为了or<>der因为这样又会引入or,现在我们输入ord<>er by x进行尝试,发现最多到order by 3就停止了,这说明这个表只有3列。现在我们就需要找出具体的flag位置,这就涉及到对mysql数据库结构的了解。

查找flag

MYSQL数据库

Mysql数据库里面有一个数据库叫information_schema,这个数据库中很多有用的信息都存在这个里面

  • schemata表里面存储了不同数据库的信息,如下所示:

  • tables表里面存储着每个数据库中包含的所有的表的信息,如下所示:

  • columns表里面存储着每个数据库中列的信息,如下所示:

查看数据库信息

知道这些东西之后,我们现在要找flag,我认为flag多半是在这个数据库里面,首先我们查看一下当先数据库的名称,因为已知查询到的数据是3列,现在我们要计算,输出在前端的到底是哪一列的数据,这里我们构造一个payload为?id=1 un<>ion sel<>ect 1,2,3,发现输出的有2,那么可以肯定输出在前端的就是第二列。

现在我们想要知道这个表在哪个数据库,所以就可以构造一个payload为?id=1 un<>ion sel<>ect 1,database(),3,得到前端的返回结果为



现在我们就要查找这个sqli数据库中存在哪些表,在前面我们说过,表的信息存在tables中,所以这里构造一个payload为?id=1 un<>ion sel<>ect 1,table_name,3 from information_schema.tables whe<>re table_schema='sqli',然后可以得到该数据库中有两张表,一个是info,一个是users



现在我们分别查一下这两个表里面都有哪些列,信息从columns里面查到,这时候我们可以构造payload为?id=1 un<>ion sel<>ect 1,column_name,3 from information_schema.columns where table_schema='sqli' an<>d table_name='users'?id=1 un<>ion sel<>ect 1,column_name,3 from information_schema.columns where table_schema='sqli' an<>d table_name='info',分别如下所示:



找到flag

好吧看了一下列名称,竟然都有flag这个东西,那只能一个表一个表找了,首先找一下第一个表users,这时候我们可以构造payload为?id=1 un<>ion sel<>ect 1,flag_9c861b688330,3 fr<>om users,但是发现并出不来任何东西。。感到疑惑,好吧那就试下一个构造payload为?id=1 un<>ion sel<>ect 1,flAg_T5ZNdrm,3 fr<>om info,这时候出来结果了,如下所示:



然后复制这个flag交差,就ok啦!

感想

这是第一次做sql注入的题,虽然这个题比较简单,但是总的来说我还是学到了不少东西的,比如Mysql数据库中的表结构和sql注入的绕过等,我觉得还是很有教育意义的。

一道简单的SQL注入题的更多相关文章

  1. 实验吧_简单的sql注入_1、2、3

    简单的sql注入1 看着这个简单的界面,一时间没有特别好的思路,先输入一个1',发生了报错 初步猜测这是一个字符型的注入,他将我们输入的语句直接当成sql语句执行了,按题目的意思后面肯定过滤了很多注入 ...

  2. 【实验吧】CTF_Web_简单的SQL注入之3

    实验吧第二题 who are you? 很有意思,过两天好好分析写一下.简单的SQL注入之3也很有意思,适合做手工练习,详细分析见下. http://ctf5.shiyanbar.com/web/in ...

  3. 实验吧简单的sql注入3

    今天早上起来发现有人评论说我没更新实验吧sql注入3,主要是因为前段时间都去做bugku去了 但是重做这道题发现以前的姿势不行了,exp()报错不再溢出,现在不能用这个姿势,所以这里重新整理了一遍思路 ...

  4. 【实验吧】CTF_Web_简单的SQL注入之1

    题目链接:http://ctf5.shiyanbar.com/423/web/ 简单的SQL注入之1,比2,3都简单一些.利用2 的查询语句也可以实现:1'/**/union/**/select/** ...

  5. 简单的SQL注入学习

    引贴: http://blog.163.com/lucia_gagaga/blog/static/26476801920168184648754/ 首先需要编写一个php页面,讲php页面放入/opt ...

  6. 实验吧之【简单的sql注入 1、2、3】

    实验吧的三道sql注入(感觉实验吧大部分web都是注入) 简单的SQL注入 地址:http://ctf5.shiyanbar.com/423/web/ 这道题也是sql注入,输入1,页面显示正常,输出 ...

  7. 实验吧简单的SQL注入1,简单的SQL注入

    接上面一篇博客. 实验吧简单的sql注入1 题目连接   http://ctf5.shiyanbar.com/423/web/ 同样,直接输入 1加个但引号,结果下面有返回错误,            ...

  8. union注入的几道ctf题,实验吧简单的sql注入1,2,这个看起来有点简单和bugku的成绩单

    这几天在做CTF当中遇到了几次sql注入都是union,写篇博客记录学习一下. 首先推荐一篇文章“https://blog.csdn.net/Litbai_zhang/article/details/ ...

  9. 一道简单的CTF登录题题解

    一.解题感受 这道题50分,在实验吧练习场算比较高分,而且通过率只有14%,比较低的水平. 看到这两个数据,一开始就心生惬意,实在不应该呀! 也是因为心态原因,在发现test.php之后,自以为在SQ ...

随机推荐

  1. 洛谷 P1438 无聊的数列 题解

    原题链接 首先,我们考虑用差分解决问题. 用 \(x_i\) 表示原数列,\(a_i = x_i - x_{i-1}\) 那么,先普及一下差分: 如果我们只需要维护区间加值,单点求值的话,你会发现两个 ...

  2. R语言基本操作

    is.na and is.element is.na can use which, it finds specific rows, is.element can't, it is designed t ...

  3. OpenCV-Python 傅里叶变换 | 三十

    目标 在本节中,我们将学习 使用OpenCV查找图像的傅立叶变换 利用Numpy中可用的FFT函数 傅立叶变换的某些应用程序 我们将看到以下函数:cv.dft(),cv.idft()等 理论 傅立叶变 ...

  4. 【Pytest03】全网最全最新的Pytest框架fixture应用篇(1)

    fixtrue修饰器标记的方法通常用于在其他函数.模块.类或者整个工程调用时会优先执行,通常会被用于完成预置处理和重复操作.例如:登录,执行SQL等操作. 完整方法如下:fixture(scope=' ...

  5. 自签SSL证书

    0.介绍 自己开发的使用了SSL协议的软件,通常没必要从证书签发机构那里来获取证书,自签证书成了必要的选择.自签证书还可以用来实现客户端登录认证. 1.创建CA 创建CA的私钥 openssl gen ...

  6. SpringCloud微服务架构和SOA架构

    1,传统的三层架构 在传统的架构中,SSH,SSM,主要分为web 控制层,业务逻辑层,数据库访问层,单点项目,项目没有拆分,所有的开发任务全部写在一个项目中,耦合度比价高,如果程序中的一个功能出现了 ...

  7. Java 垃圾回收机制方法,判断对象存活算法

    垃圾回收机制: 不定时去堆内存中清理不可达对象.不可达的对象并不会马上就会直接回收, 垃圾收集器在一个Java程序中的执行是自动的,不能强制执行,即使程序员能明确地判断出有一块内存已经无用了,是应该回 ...

  8. iOS 架构

    一.MVC MVC 全名 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离 ...

  9. AQS源码解析

    文大篇幅引用自HongJie大佬的一行一行源码分析清楚AbstractQueuedSynchronizer,这只是一篇简单的个人整理思路和总结(倒垃圾),如果觉得有些难懂的话,不要犹豫也不要疑惑,很明 ...

  10. Python——Matplotlib库入门

    1.Matplotlib库简介 优秀的可视化第三方库 Matplotlib库由各种可视化类构成,内部结构复杂,受Matlab启发 matplotlib.pyplot是绘制各类可视化图形的命令子库,相当 ...