声明: 本文章仅限于安全技术交流,禁止用于非法途径,如读者作出危害网络安全的行为后果自负,与作者无关!
一、什么是sql注入
SQL注入是一种常见的网络安全漏洞和攻击方式,它利用应用程序对用户输入数据的处理不当,使得攻击者能够在执行SQL查询时插入恶意的SQL代码。通过成功注入恶意代码,攻击者可以执行未经授权的数据库操作,获取敏感信息、篡改数据甚至完全破坏数据库。
二、sql盲注关卡
low
我们先来看他的页面
发现这里对比普通关卡,不再显示用户名只是显示存在和不存在,这里我们来看一下代码
代码如下(示例):
<?php
if( isset( $_GET[ 'Submit' ] ) ) {
// Get input
$id = $_GET[ 'id' ];
// Check database
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $getid ); // Removed 'or die' to suppress mysql errors
// Get results
$num = @mysqli_num_rows( $result ); // The '@' character suppresses errors
if( $num > 0 ) {
// Feedback for end user
echo '<pre>User ID exists in the database.</pre>';
}
else {
// User wasn't found, so the page wasn't!
header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' );
// Feedback for end user
echo '<pre>User ID is MISSING from the database.</pre>';
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
这里发现传入的参数没有使用任何防护的措施。
这里使用exp:
1' or 1=1#
发现这里的回显是存在的,这里就可以证明存在sql注入漏洞。
盲注对普通的注入的区别,就是他没有了回显位,这里只是看他的一个判断是否存在来进行注入。
这里我们已经知道数据库名为dvwa是四个位置,这里我就简单说一大概。
exp1:
1' and length(database()) > 3 #
exp2:
1' and length(database()) > 4 #
这里可以看到我们在判断数据库长度的时候,我们说数据库名长度大于3的时候回显id存在,大于4的时候就回显不存在了,说明数据库名的长度是4位。
接下来来猜解数据库名是什么。
我们可以在给定的字符串中利用substr()函数,从指定位置开始截取指定长度的字符串,分离出数据库名称的每 个位置的元素,并分别将其转换为ASCII码,与对应的ASCII码值比较大小,找到比值相同时的字符,然 后各个击破。
exp:
1' and ascii(substr((select database()),1,1))>50 #
发现发现用户存在说明数据库名的第一位的ascii码大于50
1' and ascii(substr((select database()),1,1))>100 #
发现发现用户存在说明数据库名的第一位的ascii码小于100
这里拿出我们的burp来做一个批量判断
还是先抓包,然后发送到的intruder模块进行批量修改
设置数值
点击开始攻击
这里点击状态或者长度进行一个排序可以看到数据库名第一位的ascii码数值为100
我们来查看一下ascii码100对应的是什么
https://www.sojson.com/asciitable.html
可以看到第一位就是d。
接下来我直接获取数据库名,现在已经知道数据库长度是4位,接下来我们使用burp来设置,还是先抓包,发送到的intruder模块进行修改
点击开始攻击
查看对应的ascii码最后得出来的数据库名称位dvwa。
medium
我们还是先来看页面回显
接下里看代码
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$id = $_POST[ 'id' ];
$id = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Check database
$getid = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $getid ); // Removed 'or die' to suppress mysql errors
// Get results
$num = @mysqli_num_rows( $result ); // The '@' character suppresses errors
if( $num > 0 ) {
// Feedback for end user
echo '<pre>User ID exists in the database.</pre>';
}
else {
// Feedback for end user
echo '<pre>User ID is MISSING from the database.</pre>';
}
//mysql_close();
}
?>
发现就是换了个提交方式
还是使用burp来抓包
点击攻击
我们来查看最后的结果,点击长度进行过滤
high
还是先看回显
代码如下:
?php
if( isset( $_COOKIE[ 'id' ] ) ) {
// Get input
$id = $_COOKIE[ 'id' ];
// Check database
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $getid ); // Removed 'or die' to suppress mysql errors
// Get results
$num = @mysqli_num_rows( $result ); // The '@' character suppresses errors
if( $num > 0 ) {
// Feedback for end user
echo '<pre>User ID exists in the database.</pre>';
}
else {
// Might sleep a random amount
if( rand( 0, 5 ) == 3 ) {
sleep( rand( 2, 4 ) );
}
// User wasn't found, so the page wasn't!
header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' );
// Feedback for end user
echo '<pre>User ID is MISSING from the database.</pre>';
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
这里传参的参数是$_COOKIE说明,这里可能会存在cookie注入
我们还是来抓包,(这里要注意看包的内容)
这里我调的数量有点大,所以时间会比较久
这里看到我都没跑完…
总结
今天的笔记就写了这个布尔注入,比较难搞的是cookie注入,得能搞清楚是哪个包,才能注入成功,搞cookie注入花了我好长时间,真的太久没搞都忘记了。以上内容为我个人理解,不喜勿喷,如有写错欢迎指出。