关注这个靶场的其它相关笔记:SQLI LABS —— 靶场笔记合集-CSDN博客
0x01:过关流程
输入下面的链接进入靶场(如果你的地址和我不一样,按照你本地的环境来):
http://localhost/sqli-labs/Less-38/
从本关开始,就进入了堆叠注入的部分了。我们的目标也从发掘注入点、获取数据库信息变为了 篡改数据库信息。那么首先明确一下目标吧,使用堆叠注入篡改任意用户的密码:
首先,用 BP 抓包,然后用时间盲注的字典去爆破后端 SQL 模板:
如下,是一个可以使用的 Payload 模板:
0' | sleep(3) | '1
通过上面的模板,我们可以推测出其后端的 SQL 模板为:
select * from users where id='$_GET["id"]';
我们可以使用如下 Payload 做一个测试,进行校验:
1' and 1='1 => 若页面回显内容,则证明存在漏洞1' and 1='0 => 若页面回显为空,则证明存在漏洞
明确了漏洞存在,且知道 Payload 该怎么写后,就是收集数据库信息、收集数据表信息 。。。 这些笔者在这里节省时间就不说了,直接当作已知条件,下面直接开始上堆叠注入的 Payload:
-- 修改 id = 1 的用户密码为 HACKER (那些表啥的都是靠信息收集,收集来的)1';update users set password='HACKER' where id=1;#
如上,我们已经能够随意篡改用户密码了。至此,SQLI LABS Less-38 GET-Stacked Query Injection-String 成功过关。
0x02:源码分析
下面是 SQLI LABS Less-38 GET-Stacked Query Injection-String 后端的部分源码,以及笔者做的笔记:
<?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");}// 直接拼接进 SQL 模板中$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 */// mysqli_more_results => 如果当前执行的查询存在多个结果,返回 “真”,否则返回 “假”if (mysqli_more_results($con1)) {//printf("-----------------\n");}//while (mysqli_next_result($con1));} else {echo '<font size="5" color= "#FFFF00">';print_r(mysqli_error($con1));echo "</font>";}/* close connection */mysqli_close($con1);} else {echo "Please input the ID as parameter with numeric value";}?>