SQL注入

发布时间 2023-08-01 16:27:23作者: fan高

前言

  本文只作为技术探讨,请不要用于非法目的或侵犯他人隐私。

漏洞原理

  sql注入指的是web应用程序没有对用户输入的数据进行合法化的判断或过滤,前端传入的参数攻击者可以进行控制。攻击者可以通过构造恶意slq代码注入到应用程序的数据库中查询,从而执行一些未授权的数据库操作。

  例如,有一条sql语句如下:

  select*from students where username='张三' and password='xxx'

  这条语句的意思是查询张三的信息。他有两个条件,username和password,当我们输入这两个参数并且全部正确时,他才会返回张三信息。假设这里没有对用户输入的数据进行判断,此时有位攻击者在username中输入了这样的数据:张三’and 1=1#。此时这条sql语句就变成了下面这样:

  select*from students where username='张三’ and 1=1#' and password='xxx'

       可以看到,攻击者输入的张三’与前面的单引号闭合了,形成了一个完整的参数,而后面的and1=1成为了sql语句的一部分,最后#为注释,把后面的语句注释掉了,此时这条语句变成了这样:

  select*from students where username='张三’ and 1=1

  可以看到,张三的信息在没有输入密码的情况下就显示出来了。这个例子就是sql注入。

SQL注入的分类

  报错注入

       利用数据库的机制,故意制造错误使数据库报错,从而获得一些想要的信息。

    extractvalue()函数报错注入:

       对XML文档进行查询的函数,格式为extractvalue(目标xml文档,xml路径)。函数的第二个参数为可控的,xml文件中查询使用的是/xx/xx/的格式,如果我们写成其他的格式,就会                    报错,并且会返回我们写入的非法格式内容,而这个非法格式的内容就是我们想要查询的内容,如果是正常的格式,即查询不到也不会报错。

       构造一个正常格式的语句:select extractvalue(1,concat('/',(select database())));

     结果既没数据返回也没有报错:

       

      构造非正常格式的语句:select extractvalue(1,concat(0x5c,(select database())));

      0x5c相当于‘\’也可以‘\\’

      还可以使用0x7e (~)

                   

       可以看到查询出来了数据库名称。

    updatexml函数报错注入:

      大佬写的文章:https://blog.csdn.net/m0_60988110/article/details/123544853

    updatexml(xml_doument,XPath_string,new_value)
    第一个参数:XML的内容
    第二个参数:是需要update的位置XPATH路径
    第三个参数:是更新后的内容
    所以第一和第三个参数可以随便写,只需要利用第二个参数,他会校验你输入的内容是否符合XPATH格式
    函数利用和语法明白了,下面注入的payload就清楚明白

      payload:updatexml("anything",concat('~',(select语句())),"anything")

    exp()函数报错注入:

      原理可以参考这位大佬:https://blog.csdn.net/weixin_41594045/article/details/83547103

      exp()数学函数,用于计算e的x次方的函数。

      版本约束:5.5<mysql版本<5.6

      payload:select exp(~(select*from(select user())a))

  联合查询注入

  布尔盲注

  时间盲注

  堆叠查询注入

  宽字节注入     

SQL注入常用payload

SQL注入的绕过

SQL注入的防御