[406]Scalers技术笔记:SQL注入原理与关键步骤(3) — ScalersTalk成长会 – 持续行动,刻意学习 – ScalersTalk Wonderland

[406]Scalers技术笔记:SQL注入原理与关键步骤(3)

学术研究 scalerstalk 浏览 0条评论

2.10.jpg

2.识别数据库

判断注入点完成后,需要识别数据库类型。一般通过异常特征识别或者特有函数语法识别。异常特征识别就是通过网站的异常报错中,收集到异常信息中关于数据库的信息。而特有函数语法识别是指,不同的数据库会有一些自有的函数,通过在注入语句中使用不同的函数,可以根据返回判定数据库情况。可以使用的函数有,关于字符串连接操作、数字操作以及系统表的一些操作。

3.拖库

  • order by N确定表列数

order by N是按第N列排列的SQL语句,当N超过实际列数,会报错。在实际操作中,目测一下页面上显示的列数,从2*N开始猜测,并且采取折半查找,确认列数。

  • Union语句提取数据

在有回显的情况下,通过Union Select语句可以查询数据直接回显至页面上。Union Select的含义是,将两个查询的结果合并在一起。Union要求两次查询结果需要有相同的列,所以你可以看出上一步获得列数的重要性了。

获得列数后,需要定位一下数据。先用Select null,….,nulll,再用Select 1,2,3..N定位列的位置。为了防止遇到类型错误,尽量小幅度替换,以便出现错误可以定位。

  • 一些系统表

MySQL中有一些系统表,记录其他的数据库的信息。Information_schema数据库中有一些表,表SCHEMATA记录了机器上的数据库名称;information_schema.tables记录了对应数据库的对应表名称;information_schema.columns记录了对应数据库对应表的对应列名称。有了这些信息。整个站点的数据库结构情况就很清楚了。

  • 绕过技巧

有些网站会在后端增加防护,同时保护错误页面,不提供具体错误信息。对于此种情况,需要做的是逐个验证关键字是否被过滤。可以采取字符串构造的一些技巧,通过返回结果判定。例如构造and ‘selectz’=’z’,并且根据返回结果判定是否过滤了select。对于存在过滤的情况,可以通过增加干扰,绕过过滤。其它的一些绕过技巧也可以在网络上找到。在此不赘述。

  • SQL盲注

对于无回显的情况,便是SQL盲注了。盲注情况下通常通过暴力破解的方式,对表与字段名字进行拆解。

一种方法是逐个的尝试,例如采用where substr(schema_name, 1,1) =’A’) >0 – 对数据库名的每一个字符猜解,于是最多需要遍历A-Za-z0-9加上下划线等共计60多个值。可以递归实现,递归的终止条件是,找不到就返回。

另外一种方法是对数级的折半查找。where ascii(substr(schema_name , 1, 1)>127)>0。比较8次即可。

还有一种方法是,比特位运算,逐位查找。也是比较8次。

这里我以SQLMap里面盲注时采用的语句为例,分析一下优秀工具的做法。

/?ITEM_ID=9392 AND 7262=IF((ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),7,1))>57),SLEEP(5),7262)

DATABASE()返回当前的数据库名字。MySQL 的CAST()和CONVERT()函数可用来获取一个类型的值,并产生另一个类型的值,即CAST(value as type); 或CONVERT(value, type); IFNULL(expr1,expr2)用于判定表达式的成立情况,如果 expr1 不是 NULL,IFNULL() 返回 expr1,否则它返回 expr2。MID() 函数用于抽取字符串的子串。ORD() 函数返回字符串第一个字符的 ASCII 值。IF(Condition,A,B)即当Condition为TRUE时,返回A;当Condition为FALSE时,返回B。ASCII值57是对应9,当大于9时,执行Sleep5秒,小于是AND语句为真立即执行。于是可以通过看返回的时间情况来判定这个AND子句是否成功。

这里留一个思考的问题,在不借助工具手工注入的时候,如何判断注入值中WHERE子句的返回值情况?

4.命令提权

如果你完成了3,那第4步应该也不会特别困难。可以通过数据库向服务器写入文件,可以先写一个小马,然后通过小马传一个大马,得到服务器的webshell。

  • 文件路径

上传文件后你需要知道网站是在服务器的哪个路径下,才能访问到上传的文件。文件路径需要在信息收集中注意观察,它有可能在网站报错的页面中,有可能在网页源代码中,甚至有可能在数据库的表里。

  • 读写文件

MySQL有select xxx into outfile “”命令可以用于写入文件。在写入的时候,要注意数据库可能会执行的转义操作,有两个比较好的方法是,采取十六进制编码,写成0x….的形式,或者采取ASCII编码,通过CHAR(xx,xx,…,xx)函数的方式实现。

在写入以后,可以通过浏览器访问,或者在有回显的情况下,通过load_file()的形式,在页面查看,以确保写入正确。

  • 命令执行

当上传成功后,在网站得到权限后,就可以执行其他操作了。到此,SQL注入的任务已经完成了。

相关文章:

[398]Scalers技术笔记:SQL注入原理与关键步骤(2)

[394]Scalers技术笔记:SQL注入原理与关键步骤(1)

本文作者Scalers,游走在口译世界的IT从业者。微信公众号ScalersTalk,网站ScalersTalk.com

转载请联系授权,否则将被公开谴责并追究法律责任。

ScalersTalk成长会行动“成长新航程:从英语初阶到同声传译”回复“VIP”查看

口译100小时训练计划群B 433686569

S君个人微信号,ScalersTalker 。打赏支付宝

scalerstalk [at] gmail [dot] com

回复“目录”查看历史文章。或者访问站点 ScalersTalk.com 查看。

与本文相关的文章