当前位置:网站首页>SQL注入基础

SQL注入基础

2022-08-10 23:35:00 抱小猫

目录

什么是SQL注入?

(1)SQL注入原理

(2)注入的两个条件

(3)MySQL中的注释

(4)SQL注入的过程

(5)SQL注入带来的危害

(6)万能密码的原理

(7)判断是否存在SQL注入

SQL注入的类型

(1)字符型

(2)数字型

(3)布尔盲注

(4)时间盲注

(5)报错注入

(6)联合查询注入

(7)堆查询注入

SQL注入漏洞形成原因?

(1)动态字符串构建引起

(2)后台无过滤

(3)错误处理不当

(4)不安全的数据库配置


什么是SQL注入?

​        攻击者利用Web应用程序对用户输入验证上的疏忽,在输入的数据中包含对某些数据库系统有特殊意义的符号或命令,让攻击者有机会直接对后台数据库系统下达指令,进而实现对后台数据库乃至整个应用系统的入侵。

​         由于服务端不安全、不完整的过滤,导致不应该非法的数据被带入,比如单双引号等导致前面语句闭合,后面就可以随意写恶意语句。

(1)SQL注入原理

       服务端没有过滤用户输入的恶意数据,直接把用户输入的数据当做SQL语句执行,从而影响数据库安全和平台安全。

(2)注入的两个条件

  •     用户能够控制输入
  •     原本程序要执行的SQL语句,拼接了用户输入的恶意数据

(3)MySQL中的注释

  • - #号-->一般需要进行编码=%23
  • - -->
  • - /*  */

(4)SQL注入的过程

  • 攻击者访问有SQL注入漏洞的网站,寻找注入点
  • 构造注入语句,将注入语句和程序中的SQL语句结合生成新的SQL语句
  • 提交生成的新SQL语句到服务器的数据库中
  • 数据库指向有注入语句的SQL语句,引发SQL注入攻击

(5)SQL注入带来的危害

  • 绕过登录验证:使用万能密码登录网站后台等
  • 获取敏感数据:获取网站管理员帐号、密码等
  • 文件系统操作:列目录,读取、写入文件等
  • 注册表操作:读取、写入、删除注册表等
  • 执行系统命令:远程执行命令
  • 最重要的危害:数据丢失

(6)万能密码的原理

  • 通过在用户名处传入参数'or 1=1 --进行万能密码登录
  • 实际查询语句:SELECT * FROM users WHERE username = **" or 1=1 --** AND password = 'anything';
  • 使用or连接两个条件,无论前一个条件对不对,只要保证后面的条件恒为真时,就能正常执行查询语句
  • 相当于:SELECT * FROM users ;

(7)判断是否存在SQL注入

  • ?id=1 and 1=1(确保and前后条件都为真)

  • ?id=1 '(加单双引号)

  • 数据库函数(布尔盲注/时间盲注)sleep((3),0) 若为真则暂停3

  • length()函数判断

SQL注入的类型

(1)字符型

传过来的数据使用单双引号包裹起来,所以需要进行单双引号闭合。

案例sqli-labs第一关:在源码中可以看出id没有任何过滤,使用单引号闭合

(2)数字型

传过来的数据没有使用单双引号包裹,查询时就无需在id传输的数据上单双引号

案例sqli-labs第二关:源码中可以看出传入的数据id没有使用单双引号包裹,且无任何过滤,我们使用updatexml进行报错注入输出root

(3)布尔盲注

true/false,传入的数据放入字符串中,不依赖时间,可以直接判断传入的数据真或假,传入数据为真时有显示,数据为假时不显示

案例sqli-labs第八关:当数据为真时有输出显示

 当数据为假时没有显示

(4)时间盲注

只能依靠时间判断真假,真假显示一个结果

 案例sqli-labs第九关:当数据正确时暂停3秒,若数据不正确则不暂停

(5)报错注入

会将错误信息输出到屏幕上,对的不会显示数据,所以我们需要依靠mysql_error()函数报出我们需要的数据

案例sqli-labs第五关:使用各种报错注入函数进行报错注入

  • ST_LatFromGeoHash()      (mysql>=5.7.x) 

  • ST_LongFromGeoHash       (mysql>=5.7.x)、使用方法与ST_LatFromGeoHash()相同(不加concat函数仅能识别系统的命令,不能使用select查询语句)

  • GTID       (MysQL >= 5.6.X-显错<=200)

  • floor (8.x>mysql>5.0)、全版本支持

  • ST_Pointfromgeohash((select语句),1)     (mysql>=5.7)  或:ST_Pointfromgeohash(系统参数,1)(两个参数都要写)

  • updatexml  :   接受三个参数(1,concat('~',(select查询语句),'~'),1)/   updatexml函数最多容纳32位,超过32位以后数据就无法显示。

  • extractvalue  :  extractvalue函数接收两个字符串参数,一个属xml标记片段和xpath表达式xpath expr ,第一个参数就是为了上传一个xml文档,第二个参数就是用xpath路径法查找路径,而extractvalue报错注入就是通过再函数中写如不符合语法格式的xpath达到报错的目的,并且通过拼接sql注入语句从而通过报错查询并显示我们想要查询的内容;

(6)联合查询注入

会报错、使用union一次查询多个select语句

(7)堆查询注入

同时执行多条语句的注入

SQL注入漏洞形成原因?

(1)动态字符串构建引起

  • ​         不正确的处理转义字符(宽字节注入)     
  • ​         不正确的处理错误(报错泄露信息)
  • ​         不正确的处理联合查询
  • ​         不正确的处理多次提交(二次注入)

(2)后台无过滤

  • ​        后台没有过滤或编码用户数据
  • ​        数据库可以拼接用户传递的恶意代码

(3)错误处理不当

  • ​        详细的错误消息返回给了用户
  • ​        错误信息会给攻击者提供下一步帮助

(4)不安全的数据库配置

  • ​       在连接文件中使用root用户和密码
原网站

版权声明
本文为[抱小猫]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_52016943/article/details/126227738