本文仅用于技术交流!严禁用于非法用途!
原创文章
联系方式:[email protected]
原理:用户提交的数据在变量参数中,由于服务器端过滤不严格,误把数据当作命令执行。
网站分层:browser —> web server —> web application —>database
应用场景:所有需要调用数据库的变量都有可能存在sql注入
危害:sql注入是针对数据库的攻击,但不仅限于数据库,也可以利用sql注入执行操作系统层面的命令。
验证方法:
基于报错的检测方法
可以在 ‘ ‘ 中在输入一个 ‘ 导致查询语句无法完美闭合(语法错误,数据库无法识别),就会报错(也可也输入 ” % / * ( )等特殊字符)。若服务器端执行并返回报错信息,就可以模糊判断目标存在sql注入漏洞,因为服务器已经执行我们的特殊符号。
注意:报错是数据库的报错信息,但不应该返回给客户端
dvwa为例:
输入 ‘ 就会报下面的错误,接下来就可以依据报错信息拼接sql语句进行查询了
基于布尔的检测方法
and 1=1 and运算,必须都为真,结果才为真
例如: and前的1为真(直接输入1就可以查询结果),and后1=1也为真。
注意:查询语句需要根据实际情况进行拼接。语句中 ‘ 是用来闭合目标查询语句的
or 1=1 or运行,有一个为真,结果就为真
a为假,但1=1为真,所以结果也为真
危害:
通过order by 语句判断目标字段数。
‘ 用来闭合目标查询语句,#用来注释后面的 ‘
输入order by 3会报错,因为没有3个字段,order by 2 没有返回信息,但也没报错,由此可判断目标查询语句,查询了两个字段。
现在已经判断出目标存在sql注入,也判断出目标查询语句和查询了多少字段,接下来就可以用union select查询数据了。
用databse(),version()两个数据库默认函数,查询出当前库名以及版本信息。(通过版本信息可判断目标是mysql数据库)
通过@@datadir和user()两个函数查询出当前数据库所在位置和用户
通过@@hostname,@@version_compile_os两个函数,可判断目标当前主机名和当前操作系统版本
可以直接查询mysql默认表:information_schema 。
table_name查询表名,table_schema查询库名,(– 表示注释。注意:–后面有一个空格)
可以直接查看所有库,所有表
查询information_schema库需要mysql的root权限,如果没有root权限,就需要进行猜测列名,表名等。
这条语句用来猜测目标是否存在user列,并且查询列中的空字段,如果有就返回,如果没有就报错,可进一步结合burp等工具加字典猜测目标列名
猜解出列名后,进一步猜解表名,原理与猜解列名一样,也可以结合burp加字典进行爆破
进一步猜解库名
判断出列名后,猜解字段内容
or运算,只要有一个内容为真,结果就为真,由此可判断user列中存在admin
模糊查询
总结:
sql注入设计范围很广,所造成的危害更多的取决于攻击者的利用方式。
文章内容便基础,笔者也只是安全圈新人,不足之处,还望前辈指点。
来源:freebuf.com 2020-07-14 23:40:30 by: HideYourTail
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
喜欢就支持一下吧
请登录后发表评论
注册