介绍
这是一个GITHUB
上找到的一个使用原生PHP
代码写的一个博客,地址是:https://github.com/qinshuang1998/Tiger-Blog
,但是这里有很多功能没有实现(这个作者是不是比我还懒,,,哈哈哈),然后我分析的话只是想让大家明白一下这些功能是如何实现的,还有如果有漏洞的话我也会写出来(因为我是边读边写,然后自己分析一下,但是因为我水平也不是很厉害,所以有很多漏洞也没看出来还请大佬们多多指教),对我们的代码审计有很大的帮助,不多说啦,
源代码讲解
First、
这里说明一下,我分析的时候,只会写注释,或者截屏然后在旁边标注一下,因为我觉得这样会比较高效一点,所以你们可以下载这个源代码,然后按照我分析的然后再自己看一下,大概也就能明白功能实现原理了,祝你学习愉快。
index.php
这个是首页文件( 废话,我也知道 )~
首先看第三行和第四行:
1 | require('./inc/conn.php'); // 连接数据库 |
2 | require('./inc/func.php'); // 引入函数文件(一般都是封装了常用的函数,方便调用) |
这个不必多说。
接着到了第七行:
1 | $url = $_SERVER['REQUEST_URI']; //这个功能我也不知道是干嘛的,我们来输出一下。 |
2 | var_dump( $url );die; //输出一下$url,并且不然他执行下面的代码 |
这个是用于输出除了域名外的路径。
第8行:
1 | $url = parse_url($url); // parse_url将路径放在了数组的path,将?后面的参数放在了数组的query |
2 | var_dump( $url );die; // 如果上面字体描述的不懂我们再来打印一下。 |
打印$num:
1 | var_dump( $num );die; |
这里为什么是5呢?我也好奇,然后我来到数据库看了一下。
这个5就是article
表的数量
16-23行
1 | if(@$_GET['page']){ |
2 | // 把个个参数都打印一下。 |
3 | $pageval=$_GET['page']; |
4 | echo( '$pageval -> '.$pageval ."<br />"); |
5 | $page=($pageval-1)*$pagesize; |
6 | echo( '$page -> '.$page ."<br />"); |
7 | $page.=','; |
8 | echo( '$page -> '.$page ."<br />");die; |
9 | } |
看不明白看下去先
然后下面的就基本上是简单的SQL
语句了,不讲解了,开始另一个文件
admin功能
先讲解后台功能的实现。
登陆功能
在
xxx/admin/login.php
login.php
打开后发现只有一句代码:
1 |
|
2 | |
3 | require('./page/login.html'); // 包含当前的page文件夹里的login.html文件 |
login.html
打开后就是一些前端登陆的表单以及一些样式,然后他是将登陆的数据提交到confirm.php
文件,如图:
表单之类的html
代码不多讲,这里来分析一下js代码(这里有一个问授权访问漏洞,可以不输入密码直接登陆):
然后我们来尝试登陆一下,查看result
都会返回什么~
表示登陆成功
表示登陆失败
我们身为白帽子,就是用来打破这些规矩的,输入错误密码的时候我们来抓包获取返回结果并且将result
修改为success
~
成功绕过
接下来讲解一下confirm.php
文件是如何接受数据的。
confirm.php
上面的$result
使用了GetALL
函数,我们来看一下他的代码。
1 | function GetAll($query) { |
2 | |
3 | while($tmp = mysql_fetch_array($query)){ |
4 | $result[] = $tmp; |
5 | } |
6 | |
7 | return @$result; |
8 | } |
查询$query
这个sql
语句执行后的数据然后循环赋值到$result
数组里。
这里的不多将了,具体有注释了,下面没注释的就是一些登陆操作的(我也看不懂)
index.php
登陆页面分析完了,来分析一下首页页面。
page文件夹里面的都是html
文件,也就是展示页面效果的,就不多讲解了。
upload.php
这个文件是后台发布文章的
这里是存在Csrf
漏洞的,而且也没有过滤Xss
漏洞,所以是存在Xsrf
的,但是因为这里他完成了插入功能,但是没有完成展示插入的数据的功能,所以没办法继续讲解了,等作者把功能实现了我再来具体分析。