Home  >  Article  >  Backend Development  >  请问关于攻击 PHP 网站的技术

请问关于攻击 PHP 网站的技术

WBOY
WBOYOriginal
2016-06-13 13:52:54829browse

请教关于攻击 PHP 网站的技术
大家好,最近我们来了个变态老师给了一个变态的课题,希望大家给些建议:
  他在校内局域网内创建了一个用 Linux + Apache + PHP + PostgreSQL 搭建的一个个人站点,然后我们的作业就是发现该站点的bug或者直接攻击它(本人贼想接管它的服务器然后给他换成黑屏!),找到一个bug就加分...
  暂时想到的2个方法是:
  1. 编写一个shell,无穷地测试直到找到该网站的一个法定帐号。 (已经有几个同学这样干了,达到了5分钟10 000的登人请求包,但是没有成功,原因是老师狡猾,ID并不是常见的 user, webadmin 等,所以给这个方法带来了难度)
  2. 利用session作文章(网上看到的,但是不知道如何操作)

所以现在很矛盾,没有这方面的经验也没有很好的ideas,所以在这里请高手们出山指点一二,如果能稍微介绍详细点那就感激不尽。

先谢谢拉,回答满意地追加分



------解决方案--------------------
SQL inject / XSS / CC ....
------解决方案--------------------
好厉害。。。
------解决方案--------------------
SQL inject / XSS 
这两个比较靠谱
------解决方案--------------------
仅供参考:


如何入侵php网站

第一讲:判断有没注射点 
这个很简单,我们最常用的就是看到页面的格式为:index.php?id=2这样的地址,我们知道PHP经常是和MYSQL数据库一起用的,在MYSQL数据库中一定存在一个表,比如setting_table,我们提交上面地址的时候,程序一般上这样处理的: 
1、用GET或者POST取我们提交的id=1把这个值传给一个变量id. 
2、查询:select * from setting_table where id =$id 
上面的语句就是查询的语句,我们代入$id=1就是: 
select * from setting_table where id=1 
这话是没什么问题的,会取出id为1的信息进行显示给我们,所以我们就能看到正常的页面。 

-------------- 
看我们是怎么判断的: 
1、我们提交id=1 and 1=1 
看看这个是什么效果,这里的$id就是1 and 1=1,我们看看是什么样子的: 
select * from setting_table where id =1 and 1=1 
这个语句加了一个and 语句,后面是1=1是肯定成立的,所以就不影响上面语句的成立,它还会取出id=1的信息进行显示给我们,所以我们看到的还是原来的正常页面。 
2、我们提交 id =1 and 1=2 
看看这个是什么效果,这里的$id就是 1 and 1=2,我们看看在SQL中怎么执行 
select * from setting_table where id =1 and 1=2 
分析下这个语句,前面还是一样的,只是最后加了个and 1=2,这个自然不成立啦!又因为是and连接的,so自然找不到符合条件的啦!只能回显给我们一个错误或者空白的页面拉~!! 
上面就是一般我们采用and 1=1 & and 1=2来判断的基本原来,但是这里还要注意几点,如下: 
1、程序处理的时候必须是where id =$id 而不是where id=$id,这个单引号是很不一样的,怎么不一样,以后再说。。 
2、程序对我们提交的参数没有处理或者处理的不好,导致我们可以直接提交,如果程序多我们提交的参数进行处理,又会不一样,也是后话! 
第二讲:快速判断MYSQL版本 
前提:你得到一个注射点,比如:news.php?id=1 
这个点是你找到的,提交and 1=1 和and 1=2返回的是不同的。 
我们就可以这样来猜MYSQL的版本了。。步骤如下: 
1、提交/news.php?id=1/*!40000%20s*/ 如果返回正常就说明MYSQL版本在4000版本以下,你可以依次调节最高位的数字,比如我改为39000提交,如果再正常,就提交38000....直到返回错误提示,最后固定的那个就是MYSQL的版本了。。 
下面是我提交测试时的过程(只写MYSQL版本) 
40000(+)--39000(+)--38000(+)--370000(-)--37900(+)--37800(+)--37700(-)--结束!! 
得到MYSQL版本是37700。 
2、一般我们不去猜具体的版本,我们只关系MYSQL是不是在4.0以上,以为只有4.0以上的MYSQL才支持UNION查询,以下是不支持的,所以我们经常只用/*!40000%20s*/ 看看是不是4.0以上的版本。 
PS:/*!40000%20s*/ 这里的/*!......*/是mysql里一种特殊的注释方式,也没什么好奇怪的,记得怎么用就可以了~~ 
第三讲:PHP注射怎样得到表名。。 
正准备写,看到有人问到了,就总结下,算第三讲吧! 

Quote: 
Originally posted by spirit at 2006-5-16 05:57 PM: 
看了好多 文章了 ....眼睛都花了 
里面涉及到的东西也比较全面 
不过 一直不知道怎么搞出 表 
总不能直接搞 去 字段吧..?? 
一个一个来啊 
数据库 表 字段 值... 
这个逻辑我认为是对的 .... 
对了这里还是 感 ... 
表确实不好搞,不像ASP可能直接暴出来,PHP到现在还是暴不出来的,我们一般有两个办法: 
1、靠经验猜:比如大家常用的admin,user,news,vote,wenzhang,guanliyuan等等,没办法的事。。 
2、暴代码查看:用Load_file暴出文件代码,就可以看到数据插值到什么表,什么字段了,这样就很明白了,但是load_file也很有技巧的。。以后再讲。。 
-------------------------------------------- 
具体说一下吧: 
1、这个没什么好说的,直接猜就可以了,比如你看到一个注射点,类似news.php?id=1这样的点,你用union查询得到具体的字段,比如这样:news.php?id=1 and 1=2 union select 1,2,3,4 是成立的, 
你就可以这样猜:news.php?id=1 and 1=2 union select 1,2,3,4 from admin/*如果存在admin表,就会返回真,否则就不存在表admin,其他和这个一样的。 
2、这个就有点终极了,比如你得到他的绝对路径,可以load_file(file path)出文件的代码,比如你暴得管理员登陆的页面,就能看到他其中的SQL语句,可以看到他是从哪个表了取的值了,是吧》》 
原理就是这样的,多多思考,有什么心得,希望能分享。。。。 
第四讲:有无引号的差别 
很多朋友都对那个引号的作用不很了解,认为加引号和不加是一样的效果.. 
引号(包括单、双)对我们的注射是有着很大的影响的,这里主要还是和magic的状态有关,当这个magic为off的时候倒没什么影响,当这个magic为on的时候就大不一样了。。 

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn