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注入情况下呢?
简单句式举例:
看来是稳稳的可以的,再组合其他注入句式,岂不有了更不错的注入姿势。
那对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的更好更优美的姿势。
以上是关于SQL注入之骚姿势小记的主要内容,如果未能解决你的问题,请参考以下文章