sql注入简单总结

2019-11-03  本文已影响0人  jun123123

最近两周刷了一下sqli-labs,对sql注入有了一个基本的认识。这里写个总结。

1.sql注入原理简单介绍
在一般的编程语言中,字符串是作为一种基本数据类型储存的,不会被编译器解析。但是有些函数会接受一个参数并将其解析为代码语句执行,如php中的eval()函数。有时我们需要接受用户的参数,并将其作为字符串的一部分传入类eval()函数(或类似的函数),若此时没有对用户参数进行严格过滤,就会产生各种安全漏洞,如js中的xss,php中eval()函数产生的webshell,以及数据库交互中产生的sql注入漏洞等。
很多编程语言都提供了与数据库进行交互的函数,如php中的mysql_query()/mysqli_query()函数,通过拼接用户传入的参数和特定语句构成sql查询语句。如

$un = $_POST['username'];
$pw = $_POST['password'];
$sql = "SELECT * FROM users WHERE name = '$un' AND password = '$pw'";
$result = mysql_query($sql);

以上语句即将用户传入的$id参数与select语句拼接构成sql语句后通过mysql_query()函数进行查询。
假设有一个恶意用户传入了参数username=admin&password=0' or 1=1#,而后端又没用对输入进行过滤/转义。拼接后的sql语句为"SELECT * FROM users WHERE name = 'admin' AND password = '0' or 1=1#'"'#'在sql中作为注释符使用。此时的sql语句中由于1=1恒为真,与前面语句进行or运算后仍恒为真,从而绕过了对password的校验实现了admin账号密码绕过。
在sql中除了#号外,-- (注意末尾有空格)也被视为注释符。有时页面以get方式提交数据,会直接写在url上。由于#在url中有特殊的含义(锚点),因此一般使用其url编码%23,后端接受到数据后会自动进行url解码。同样由于一般注释符都出现在变量的最后也就是url的最后,而url最末尾的空格在传输时会被略去,所以使用--+代替,+会被解码为空格。
另外在sql注入中,payload不一定是用户提交的参数,也可能在请求头中。需要根据具体的后端逻辑判断注入点。

2.注入类型判断

(1).注入类型

(2).类型判断

3.数据库名表名列名获取

4.简单的注入方式介绍

5.基本绕过姿势

一般正常的题都不会这么直接给注的,都会有一些过滤,这时候要考虑怎么绕过这些过滤。对于检测到的关键字也可能有不同的处理,有的会直接过滤而有些会进行转义。对于不同的情况,可以尝试不同的绕过方法。

上一篇 下一篇

猜你喜欢

热点阅读