2018年6月20日记录:
在实验吧做了一道关于后台登陆的题目,之前自己对php注入方面认识的不是很好,所以一直对注入这方面谈虎色变,今天做了一下,其实自己好好分析整个过程,发现并不是特别难的,难得只是不敢动手去做:
我看到这个问题的时候一看网址:
http://ctf5.shiyanbar.com/web/houtai/ffifdyop.php
没有文件包含的意思(最近被打击,总是想着确认一下),然后是正儿八经的php站点,想着肯定是涉及到注入了,点击了输入框,查看了一下源代码,找到了后台数据库的查询代码:
$password=$_POST['password'];
$sql = "SELECT * FROM admin WHERE username = 'admin' and password = '".md5($password,true)."'";
$result=mysqli_query($link,$sql);
if(mysqli_num_rows($result)>0){
echo 'flag is :'.$flag;
}
else{
echo '密码错误!';
}
分析了一下,emm。。。一看就是POST,是提交查询,注入的了。
分析了下代码,在一个位置发现对我们输入的密码进行了md5加密:
password = '".md5($password,true)."'";
这个时候我是真的不知道了,因为我是菜鸡,所以就在网上搜索了下关于md5的知识,发现一个字符串加密之后,在经过md5解密后会形成新的字符串。那么这个样子的话,我们如何构造一个字符串使它加密解密之后和我们判断有没有php注入点的式子一样的话正好就可以呀!
再看后面的代码,只是判断了返回回来的结果的行数是否是大于零的:
$result=mysqli_query($link,$sql);
if(mysqli_num_rows($result)>0)
说明正好有戏!
后面参见了一篇文章,说到我们寻找这样字符串的时候其实并不是特别容易,他给出了一个字符串,解密加密之后正好可以和我们判断的式子一样可以达到相同的查询结果就是:ffifdyop——-> ‘or’6
然后我一看,不对啊,怎么个链接给的php地址的名字是一样的呀,这才想到了出题人的良苦用心呀,答案就在眼前,自己不好好注意!就这样,这道题就这样解决了。
拓展知识(萌新的我,苦呀,emm。。。。):
PHP:
mysqli_query():
命令用来执行针对数据库的查询,有三个参数,
- connection(必须,用来建立一个规定的Mysql链接)
- query(必须,用来查询的字符串)
- resultmode(可选参数)
返回值:对于SELECT,DESCRIBE,EXPLAIN,SHOW的查询,返回值是一个mysqli_result结果,对于其他查询成功的语句,返回的是TRUE或者FALSE。
mysql_num_rows() :
用来返回结果集中行的数目。
有一个参数:
1. data(必须,用来执行结果集,从mysql_query中调用的到)
- mysql_num_rows() 返回结果集中行的数目。此命令仅对 SELECT 语句有效。要取得被 INSERT,UPDATE 或者 DELETE 查询所影响到的行的数目,用 mysql_affected_rows()。
如果使用 mysql_unbuffered_query(),则直到结果集中的所有行都被提取后 mysql_num_rows() 才能返回正确的值。*