声明: 本文章仅限于安全技术交流,禁止用于非法途径,如读者作出危害网络安全的行为后果自负,与作者无关!
前言
Hello!转眼一看距离我上次发文章都是一年前的事情了,中职的第三年都一直备赛的路上,一年比了三个项目,搞得学的好乱,现在上了大学,开始回来复习安全的东西,说实话好久没练了很多基本的东西都忘记了,去年就一直说要写dvwa的教程,现在刚好算是可以边复习边更新。哈哈哈哈哈哈!
一、 什么是sql注入
SQL注入是一种常见的网络安全漏洞和攻击方式,它利用应用程序对用户输入数据的处理不当,使得攻击者能够在执行SQL查询时插入恶意的SQL代码。通过成功注入恶意代码,攻击者可以执行未经授权的数据库操作,获取敏感信息、篡改数据甚至完全破坏数据库。
二、普通sql注入关卡
low
首先看一下他的回显是什么样子的
我们来看他的代码:
<?php
if( isset( $_REQUEST[ 'Submit' ] ) ) {
// Get input
$id = $_REQUEST[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}
mysqli_close($GLOBALS["___mysqli_ston"]);
}
?>
这里看到这里定义了一个id参数,然后没做任何防护语句就直接传参给了sql语句。
首先我们来判断闭合的符号,这里输入一个单引号发现出现了报错语句
判断了他是什么闭合方式后,判断有多少字段
' order by 2 # # 发现回显正常
' order by 3 # # 发现报错了
说明这里就只有两个字段
下一步我们来判断他的一个回显位置,使用联合查询语句
-1' union select 1,2 #
知道了注入点以后我们再来查询当前的数据库
-1' union select (select database()),2 #
查看回显
发现成功回显数据库名
medium
先查看正常回显
然后我们还是来看他的代码
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$id = $_POST[ 'id' ];
$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);
$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die( '<pre>' . mysqli_error($GLOBALS["___mysqli_ston"]) . '</pre>' );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Display values
$first = $row["first_name"];
$last = $row["last_name"];
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}
}
// This is used later on in the index.php page
// Setting it here so we can close the database connection in here like in the rest of the source scripts
$query = "SELECT COUNT(*) FROM users;";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
$number_of_rows = mysqli_fetch_row( $result )[0];
mysqli_close($GLOBALS["___mysqli_ston"]);
?>
这里发现代码中采用了mysqli_real_escape_string函数对字符串进行转义处理。
但是我们发现代码中sql语句的$id,是没有用任何符合进行闭合的,那我们就可以像low关卡中使用一样的语句。
这里拿出我们的burp进行抓包
把抓到的数据包发送到我们的爆破模块
之前在讲low的时候说过语句了,这里我就不再说一次,直接查看数据库名
这里的exp是:
-1 union select (select database()),2 #
high
先查看回显
然后我们在来看代码
SQL Injection Source
vulnerabilities/sqli/source/high.php
<?php
if( isset( $_SESSION [ 'id' ] ) ) {
// Get input
$id = $_SESSION[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>Something went wrong.</pre>' );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
这里看到点击 here to change your ID就自动跳到其他的页面,这里主要是防止自动化sql注入,但是我们可以从代码中看出,传入的参数还是没有做防护。
以至于我们拿low关卡的exp就能直接跑出数据库名
总结
行,今天算是开了一个头,先解决了普通的sq注入,看一下明天有没有时间,有时间再来更新sql盲注。以上内容为我个人理解,不喜勿喷,如有写错欢迎指出。