0


SQL 注入(SQL Injection)学习心得

提示:文章写完后,目录可以自动生成


前言

网工小白学习安全心得,学习web渗透第一章sql注入


一、SQL 注入是什么?

    SQL 注入(SQL Injection):SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息(百度百科)。简单来说就是就是sql查询语句然后去通过web的一些过滤不严格从而去达到获取后台数据库内容的手段。欺骗数据库服务器执行非授权的任意查询,从而进一步获取到数据信息。

危害:

    数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。
     网页篡改:通过操作数据库对特定网页进行篡改。
     网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。
     数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
     服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改           或控制操作系统。
     破坏硬盘数据,瘫痪全系统。

分类:按照数据类型:数字型注入、字符型注入。

     按照注入方式:联合注入、报错注入、布尔注入、时间盲注、宽字节注入等。

     按照请求方法:GET型注入、POST型注入。

二、SQL 注入攻击手法

1.联合查询注入

    使用联合查询进行注入的前提是我们要进行注入的页面必须有显示位。所谓联合查询注入即是使用union合并两个或多个SELECT语句的结果集,所以两个及以上的select必须有相同列、且各列的数据类型也都相同。联合查询注入可在链接最后添加order by 9基于随意数字的注入,根据页面的返回结果来判断站点中的字段数目

2.基于错误信息的注入

    此方法是在页面没有显示位,但是echo mysql_error();函数输出了错误信息的时候方能使用。优点是注入速度快,缺点是语句较为复杂,而且只能用limit依次进行猜解。总体来说,报错注入其实是一种公式化的注入方法,主要用于在页面中没有显示位,但是用echo mysql_error();输出了错误信息时使用。

3.基于布尔的盲注

    因为web的页面返回值都是True或者False,所以布尔盲注就是注入后根据页面返回值来得到数据库信息的一种办法。

4.基于时间的盲注

    当布尔型注入没有结果(页面显示正常)的时候,我们很难判断注入的代码是否被执行,也可以说到底这个注入点存不存在?这个时候布尔型注入就无法发挥自己的作用了。基于时间的盲注便应运而生,所谓基于时间的盲注,就是我们根据web页面相应的时间差来判断该页面是否存在SQL注入点。

三、注入的流程以字符型联合查询为例(思路)

1.区分是web是动态还是静态(很重要),只用动态网页(与数据库有数据的交互读写)存在SQL注入的可能,用户可以控制传递的参数。

2.SQL注入可能存在的位置,url传参(http://127.0.0.1/sqli/Less-1/?id=1)上传不同的参数获取到的界面也不一样,主要存在于新闻/商品等查询处。

3.判断是数字型还是字符型and 1=1 and 1=2 或者 ‘ 或者 \

and 1=1时页面返回正常,可能是字符型,and 1=2时按逻辑来说1=2应该时页面返回应该出错,但是此时页面返回依旧正常,判断属于字符型,字符型就需要去判断字符属于哪一种一般有:'[$get]'、"[$get]"、('[$get]')、("[$get]") ,尝试id=1'看页面显示如果报错则说明是'[$get]',如果不是则继续尝试

如果不是页面返回依旧正常如下图,因为本身半段的语句就是错误的1=2,如果字符正确因为执行错误语句,如果是1=1则相反。

以下为数字型的判断

and 1=1

and 1=2

4.判断字段数 order by函数

'http://127.0.0.1/sqli/Less-1/?id=1' order by 5--+

字段数不对,则继续猜测 更换order by后面数

字段数正确时

5.联合查询得到输出点(注意错误信息的注入、布尔盲注、时间盲注没有输出点)

union select 1,2,3

看显示得出显示数字2,3的地方为输出点

输出点:能展示数据库的地方

6.查看版本和数据库名字

函数查看版本version(),查看数据库名database()。

得知版本为:5.7.26,数据库名为:security

7.查询表名

http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+

看输出位置能得知表名有emails,referers,uagents,users,

8.查询users字段名

http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'--+

字段有:id,username,password

9.查询username,password 字段数据

http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,group_concat(username),group_concat(password) from users --+

以上为一次完整的字符型SQL注入流程。

总结

    以上就是今天要分享的内容,本文仅仅简单介绍了SQL注入的流程,SQL注入的原理,以一次完整的字符型SQL注入流程为例,其余三种都是基于这个思路,只是应对于不同的防护用不同的手段。思路重点在于明白最终想要的是数据库中的内容,怎么一步步去获得里面的数据。

本文转载自: https://blog.csdn.net/coldsummer23/article/details/127735048
版权归原作者 Cold summer 所有, 如有侵权,请联系我们删除。

“SQL 注入(SQL Injection)学习心得”的评论:

还没有评论