SQL注入之骚姿势小记

Posted FreeBuf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入之骚姿势小记相关的知识,希望对你有一定的参考价值。

写在前面

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

By 010

1、IN之骚

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

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

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

举个例子:

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

简单句式举例:

SQL注入之骚姿势小记

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

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

2、BETWEEN之骚

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

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

举个例子:

SQL注入之骚姿势小记

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

看图:

SQL注入之骚姿势小记

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

SQL注入之骚姿势小记

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

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

3、ORDERBY之骚

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

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

SQL注入之骚姿势小记

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

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

4、列名构造之骚

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

从它:

SQL注入之骚姿势小记

到它:

SQL注入之骚姿势小记

不就新构出了列名?

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

SQL注入之骚姿势小记

5、临时变量之骚

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

SQL注入之骚姿势小记

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

注入的时候怎么用呢?

SQL注入之骚姿势小记

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

还有个实用的小利用:

SQL注入之骚姿势小记

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

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

6、运算符之骚

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

举个例子:

SQL注入之骚姿势小记

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

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

SQL注入之骚姿势小记

看好哟,username和password是varchar型。

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

SQL注入之骚姿势小记

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

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

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

SQL注入之骚姿势小记

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

SQL注入之骚姿势小记

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

SQL注入之骚姿势小记

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

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

SQL注入之骚姿势小记

7、大/小于号之骚

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

SQL注入之骚姿势小记

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

总结

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

以上是关于SQL注入之骚姿势小记的主要内容,如果未能解决你的问题,请参考以下文章

SQL注入的“冷门姿势”

SQL注入的各种姿势

SQL注入常见的姿势一:联合查询注入

Bypass 护卫神SQL注入防御(多姿势)

SQL报错常见的注入姿势

SQL报错常见的注入姿势