SQL注入
- 原理:以简单的get方法举例
#在进行页面请求的时候,页面和数据库打交道,会向数据库里面传入sql语句,示例如下
页面输入为 1
源码为:
$query = SELECT first_name, lastname FROM users WHERE user_id = $1
实际传入
SELECT first_name, last_name FROM users WHERE user_id = '1'
在上面的语句中,1是输入的数字,这种情况下,我们可以在输入的时候加一些其他语句,例如 order by 1…n 得到 数据库的列数
#页面输入:
1' order by 1#
实际传入:
SELECT first_name, last_name FROM users WHERE user_id = '1' order by 1#`;
在mysql中,'#'后面的会被注释掉,所以在数据库层面看来,sql语句是:
SELECT first_name, last_name FROM users WHERE user_id = '1' order by 1;
按照此逻辑,很多东西都可以做,比如绕过验证通过,or 1 == 1
这种类似的语句,对数据库的系统表了解的,可以查询系统表中的信息。
- 攻击检测(服务端)
最简单的是在查询的时候加入右 ’ ,sql语句如下
# 在右边进行右',相当于结束符,后面添加任何其他语句会报错
http://xxx/abc.php?id=1'
- 验证sql注入漏洞模式(11 | 12 )
#常见的漏洞模式
数据库中有很多其他类型,但是最常用的就是char 类型和 int 类型。
利用上面的 or 1==1 或者 1==2 来看网站漏洞是否是int类型
代码如下:
select * from <表名> where id = x and 1 == 1
select * from <表名> where id = x and 1 == 2
如果1 正常运行,2返回类型错误,则证明为int类型,
如果是char类型的话,两个语句真正执行的是
select * from <表名> where id = ' x and 1 == 1'
#char类型
类似的,如果为char类型的话,只需要更改执行语句也可以达到对应的效果
' and '1' = '1
实际执行的为下面的语句:
select * from <表名> where id = '1' and '1' == '1'