SQL注入之骚姿势小记

写在前面

小记一下CTF那些日子和DROPS队友学到的SQL注入的骚姿势。

By 010

1、IN之骚

这个我也偶然发现的,也不知前辈们有没有早已总结好的套路了。w3school上对in操作符的介绍:

http://www.w3school.com.cn/sql/sql_in.asp

对它的描述:IN操作符允许我们在WHERE子句中规定多个值。也就说可以让我们依照一或数个不连续(discrete)的值的限制之内抓出数据库中的值。

举个例子:

那它是否可用于在过滤等号和过滤like的sql注入情况下呢?

简单句式举例:

看来是稳稳的可以的,再组合其他注入句式,岂不有了更不错的注入姿势。

那对in的可多个值的特性有没有什么好的用法呢?一脸懵逼我的想到千倍爆破一句话木马的姿势,在注入get不到字段时候用它爆破一下字段也可以很大提高效率呀(好吧,貌似我异想天开了。)。这个特性我先记在小本本上了,以后说不定碰到合适的用处。

2、BETWEEN之骚

同样也是偶然发现,不过between+and的中and让人感觉挺鸡肋的。在w3chool上对between操作符的介绍:传送门

对它的描述:BETWEEN操作符在WHERE子句中使用,作用是选取介于两个值之间的数据范围。也就说让我们可以运用一个范围(range)内抓出数据库中的值。

举个例子:

那它是否也可用于在过滤等号和过滤like的sql注入情况下呢?

看图:

看到了什么?纳尼?还怕单引号被过滤?再看个:

还稳稳的支持十六进制绕过姿势。

这个姿势下换个语句:selectpassword from users where password between ‘a’ and’d’,再配合个脚本,这样岂不是能够直接跑password了?不就又get到一个盲注入姿势?还是那句话,由于and的限制,用起来就很鸡肋。

3、ORDERBY之骚

这个是利用orderby的排序的姿势进行盲注。利用条件就是要有对应注入出数据同一行的其他字段的回显(例如:想注入出password,web端要有username或者id或者……的回显)。

简单示例,假如要通过注入得到abcde用户密码,web页面有个username回显,那么就可以尝试这个姿势:

通过orderby3对查询到的第三个字段password进行排序,改变select的第三字段位置的内容,如:aa时候web页面显示username为test,ab时候还是显示为test,ac时候变成了abcde,就证明password前两个字符为ab,然后依次再往后猜测……

这个姿势再结合个脚本岂不美滋滋。

4、列名构造之骚

注入中有时候会遇到列名被waf的套路,万里之行只差出数据了,尴尬不已。在这时候,尝试自行构造一个列名也是很不错的选择。

从它:

到它:

不就新构出了列名?

再对它做个别名然后就可以不用列名注入出数据了:

5、临时变量之骚

临时变量是什么想必大家都知道,这个姿势呢~需要临时变量结合into语法来进行利用,看个简单例子:

用into对临时变量@a赋值,再去查询@a是可以得到赋值内容的。

注入的时候怎么用呢?

看起来很好利用的样子,其实放到web网站上就很鸡肋了。同一注入点先web请求进行into的临时变量赋值,再web请求进行临时变量查询时候,会发现它是行不通的。在第一个web连接结束时候,临时变量释放掉了,第二次web请求查询是找不到不到它的。

还有个实用的小利用:

想到了什么?是不是可以用来orderby进行表的列数判断?

这样一来,能用它的情况现有三种场景:一个就是存在堆叠注入时候,另一个就是同web页面两个注入漏洞时候,再一个就是当orderby被waf后用来判断字段数目时候。

6、运算符之骚

话说sql也是世界上最好的语言……在运算符上的弱类型不仅仅是php的专利。

举个例子:

反正你键盘上数学运算符都有这个特性。

用常用的^举例下sql注入时候的姿势及原因,先看下表的结构:

看好哟,username和password是varchar型。

下面用的查询语句是这样的:select* from users where username = ‘一个字符串’,然而在where子句后面再加上运算符,再看产生了什么:

第一个给username=’’^1,’’^1的结果是数字1,相当于username=1,什么都没查询出来,还丢出来5个警告。

第二个给username=’’^0,’’^0的结果是数字0,相当于username=0,然后出来了表中所有数据。

下面向数据库插入第五条数据,username为1defgh:

再用刚才的语句进行查询:

再插入个username为ef1ghi的字段,进行查询:

说明了什么?在应该传入字符串型的地方传入数字型参数后,select查询时进行了类型转换:数据库中该字段首字母非数字的都被传入0的时候查询出来,该字段首字母是1的会被传入1的时候查询出来。

理解了上面所说那就应该理解这个注入姿势了:

7、大/小于号之骚

这个估计大多数都遇到过过,举个例子:

这样估计都明白了,一个可以放在盲注语句中盲打的套路,在过滤严格无法盲注的情况下,同样可以放在where子句后面进行爆破:

总结

CTF中的SQL注入就是一个bypass与waf的斗争历程。一个的常用函数,一个的常用套路,经过多个之间巧妙的组合,总会出来bypass的更好更优美的姿势。

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2017-07-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏gaoqin31

设计模式之 UML

今年接手的一个计费项目让我痛苦不堪,里面到处充斥着重复冗余的代码,一个简单的需求往往需要改n个地方,而且很多改动牵一发动全身,这个项目涉及到支付,出问题就是损失...

29820
来自专栏Jerry的SAP技术分享

Association, Composition and Aggregation in UI5, CRM, S/4HANA and C4C

比如UI5的转盘控件Carousel: 一旦转盘被析构,里面显示的page当然也没有继续存在的意义了,需要跟着被析构。

31250
来自专栏小小挖掘机

数据城堡参赛代码实战篇(四)---使用pandas合并数据表

小编们最近参加了数据城堡举办的“大学生助学金精准资助预测”比赛,分组第19名的成绩进入了复赛,很激动有木有!在上一篇文章中,小编主要介绍了pandas中使用dr...

40760
来自专栏Spark学习技巧

百度面试题:Spark 实现PageRank

PageRank算法简介 PageRank是执行多次连接的一个迭代算法,因此它是RDD分区操作的一个很好的用例。算法会维护两个数据集:一个由(pageID,li...

42630
来自专栏Python小屋

在Python程序中设置函数最大递归深度

在函数调用时,为了保证能够正确返回,必须进行保存现场和恢复现场,也就是被调函数结束后能够回到主调函数中离开时的位置然后继续执行主调函数中的代码。这些现场或上下文...

15120
来自专栏Fish

CCF 无线网络

题意如下 问题描述   目前在一个很大的平面房间里有 n 个无线路由器,每个无线路由器都固定在某个点上。任何两个无线路由器只要距离不超过 r 就能互相建立网...

24370
来自专栏码农分享

3.3、苏宁百万级商品爬取 代码讲解 商品爬取

10630
来自专栏小樱的经验随笔

Gym 100952I&&2015 HIAST Collegiate Programming Contest I. Mancala【模拟】

I. Mancala time limit per test:3 seconds memory limit per test:256 megabytes inp...

30340
来自专栏图形学与OpenGL

WebGL画点程序v3

本文程序实现画一个点的任务,如下图。其中,点的颜色由Javascript传到片元着色器程序中。

15120
来自专栏数据结构与算法

洛谷P3835 【模板】可持久化平衡树

题目背景 本题为题目 普通平衡树 的可持久化加强版。 数据已经经过强化 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对...

34560

扫码关注云+社区

领取腾讯云代金券