前言
本文只作为技术探讨,请不要用于非法目的或侵犯他人隐私。
漏洞原理
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注入的防御
标签:语句,查询,报错,SQL,格式,select,注入 From: https://www.cnblogs.com/fangao/p/17596867.html