zoukankan      html  css  js  c++  java
  • 【SQL注入技巧拓展】————15、SQL注入之骚姿势小记

    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的更好更优美的姿势。

    总会有不期而遇的温暖. 和生生不息的希望。
  • 相关阅读:
    20 个 .NET 6 新增的 API
    巅峰对决!Spring Boot VS .NET 6
    【.NET 遇上 GraphQL】 ChilliCream 平台介绍
    使用 CliWrap 让C#中的命令行交互举重若轻
    微软开源的Web测试和自动化神器 Playwright
    GraphQL 到底有什么魔力?
    win切换jdk版本
    WebBug Java漏洞靶场 Java代码审计
    Docker镜像安全的一些(初级)检测方法
    权限安全管控的设计想法
  • 原文地址:https://www.cnblogs.com/devi1/p/13486515.html
Copyright © 2011-2022 走看看