实验吧——(web)后台登陆 writeup

实验吧——后台登录writeup


sql注入:md5($password,true)

首先我们打开题目连接看到的是需要密码登录的界面
题目
查看页面的源码,我们会看到:


<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body style="background-color: #999">
	<div style="position:relative;margin:0 auto;width:300px;height:200px;padding-top:100px;font-size:20px;">
	<form action="" method="post">
		<table>
			<tr>
				请用管理员密码进行登录~~
			</tr>
			<tr>
				<td>密码:</td><td><input type="text" name='password'></td>
			</tr>
			<tr>
				<td><input type="submit" name='submit' style="margin-left:30px;"></td>
			</tr>
		</table>
	</form>
		</div>
	<!-- $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 '密码错误!';
		} -->
</body>
</html>

但其中最重要的一段是:(也是解题的关键)

<!-- $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 '密码错误!';
		} -->

里面有几个函数,我们不妨先看看这些函数
1.md5(string,raw)

参数描述
string必需。规定要计算的字符串。
raw可选。规定十六进制或二进制输出格式:

TRUE - 原始 16 字符二进制格式
FALSE - 默认。32 字符十六进制数
返回值: 如果成功则返回已计算的 MD5 散列,如果失败则返回 FALSE。

2.mysqli_query(connection,query,resultmode); //执行某个针对数据库的查询。

参数描述
connection必需。规定要使用的 MySQL 连接。
query必需,规定查询字符串。
resultmode可选。一个常量。可以是下列值中的任意一个:MYSQLI_USE_RESULT(如果需要检索大量数据,请使用这个)MYSQLI_STORE_RESULT(默认)

返回值: 针对成功的 SELECT、SHOW、DESCRIBE 或 EXPLAIN 查询,将返回一个 mysqli_result 对象。针对其他成功的查询,将返回 TRUE。如果失败,则返回 FALSE。

3.mysqli_num_rows(result); //函数返回结果集中行的数量。
参数result:必需。规定由 mysqli_query()、mysqli_store_result() 或 mysqli_use_result() 返回的结果集标识符。
返回值: 返回结果集中行的数量。

经过对这几个函数的理解,我们能够大致了解了这段代码的含义。要想得到flag,就得使得mysqli_num_rows()函数的返回值大于0,但由于我们不知道真正password是什么,随便猜测并不能正确。这时我们再看看这句代码: s q l = &quot; S E L E C T ∗ F R O M a d m i n W H E R E u s e r n a m e = ′ a d m i n ′ a n d p a s s w o r d = ′ &quot; . m d 5 ( sql = &quot;SELECT * FROM admin WHERE username = &#x27;admin&#x27; and password = &#x27;&quot;.md5( sql="SELECTFROMadminWHEREusername=adminandpassword=".md5(password,true)."’";
我们可以发现这句可以SQL注入。password字符串经过md5函数返回16位原始二进制格式的字符串中应该含有’or’

我们可以试试网页链接里面的php文件名ffifdyop

<!DOCTYPE html>
<html>
<body>

<?php 
$str = "ffifdyop"; 
echo "The string: ".$str."<br>"; 
echo "TRUE - Raw 16 character binary format: ".md5($str, TRUE)."<br>"; 
echo "FALSE - 32 character hex number: ".md5($str)."<br>"; 
?>  
  
</body>
</html>

在这里插入图片描述
我们可以看到这个字符串在md5(string,TRUE)的返回值中包含’or’,符合我们要的条件,所以在题目链接中输入这个字符串就能得到flag.

[1]http://www.runoob.com/try/runcode.phpfilename=demo_intro&type=php 菜鸟教程在线编辑器

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值