sqlilabs5

第十七关

这一关和其他的就不太一样,比如说标题是update query
所以这里 我们需要修改表中的数据
修改表中数据我们使用的是 update
语法是
update test set sex=female;//所有员工性别更改为女性
update test set sex = female where name =’zhangsan’;//更改张三这个员工的性别

看了下这题的是这样的img

imgimg

img 当我在username里面随便输了admin 他就说我成功的更改了我的密码,再结合源码,猜测这里是 在我输入账号以后,他会连接到存放我这个账号的字符段,然后将那边的密码更换成我现在输的 然后,在username无论我输那个单引号的何种组合情况,都没有反应,结合源码,我发现这里有个PHP的安全命令 **addslashes()与stripslashes()函数**

img

这边自定义了一个函数 check_input函数,里面出现了substrget_magic_quotes_gpcstripslashes这几个函数:

get_magic_quotes_gpc()函数
get_magic_quotes_gpc()函数取得PHP环境配置的变量magic_quotes_gpc(GPC, Get/Post/Cookie)值。返回0表示本功能关闭,返回1表示本功能打开
当magic_quotes_gpc打开时,所有的’(单引号)、”(双引号)、(反斜杠)和NULL(空字符)会自动转为含有反斜杠的溢出字符。所以我们在账号一栏输入的单引号等的数据没有效果的原因就在这里

addslashes()与stripslashes()函数
addslashes(string)函数返回在预定义字符之前添加反斜杠\的字符串:

  • 单引号 ’
  • 双引号 “
  • 反斜杠 \
  • 空字符 NULL

该函数可用于为存储在数据库中的字符串以及数据库查询语句准备字符串。

注意:默认地,PHP对所有的GET、POST和COOKIE数据自动运行addslashes()。所以不应对已转义过的字符串使用addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数get_magic_quotes_gpc()进行检测。
stripslashes(string)函数删除由addslashes()函数添加的反斜杠。

substr函数
substr(string,start[,length])
参数 描述
string 必需,规定要返回其中一部分的字符串
start 必需,规定在字符串的何处开始
正数:在字符串的指定位置开始
负数:在从字符串结尾开始的指定位置开始
0:在字符串中的第一个字符处开始
length 可选,要返回的字符数。如果省略,则返回剩余文本
正数:从start参数所在的位置返回的长度
负数:从字符串末端返回的长度
这里补充一下我的理解:这个substr的意思是截取字符段,也就是截取你输入的数据前几位这样,然后将截取的数据进行过滤操作,即加入反斜杠操作

ctype_digit()函数
ctype_digit(string)函数检查字符串中每个字符是否都是十进制数字,若是则返回TRUE,否则返回FALSE。

mysql_real_escape_string()函数
mysql_real_escape_string(string,connection)
参数 描述
string 必需,规定要转义的字符串
connection 可选,规定MySQL连接。如果未规定,则使用上一个连接

mysql_real_escape_string()函数转义 SQL 语句中使用的字符串中的特殊字符:

  • \x00 空值

  • \n

  • \r 换行

  • \

  • \x1a
    **知道这个点后 ,那就说明我们无法通过在账号一栏注入 **

    img

    然后我们看这个密码这一栏有个引号,所以我们这就意味着我们可以在密码一栏通过密码来注入
    我们在账号一栏输入admin以后,接着在密码一栏输入我们的注入语句

    1
    admin'and updatexml(1,concat('~',(select database()),'~'),1) -- 
    1
    123'and updatexml(1,concat('~',(select table_name from information_schema.tables where table_schema='security' limit 0,1),'~'),1) -- 

    那么我们如何绕过这个过滤呢?

    https://blog.csdn.net/qq_42181428/article/details/105061424?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-3.control 这个博客里面倒是说了个方法,但是用在这里好像不太合适,因为其实我们注意到他有一个substr函数,只截取了前15个字符,所以当我输入的语句超过15个的时候,后面的代码就自动被抛弃了。
    记得拓展学习SqlParameter

第 十八关

这个关卡好像有点不太一样,先来看看源码:

![E_{358QK8A23J%N`T0Q%2LM](https://raw.githubusercontent.com/Hwwg/myphoto/master/20201126202559.png)

可以看到在这一关,对于uname和passwd依旧做了addslashes()函数处理,所以想再这里注入不太可能img

并且在输出uname和passwd的时候也没有单引号等字符的出现,所以想在这里注入是不可能的了img

看这里 获取了uagent和IP 这个是干啥的?

HTTP_USER_AGENT:返回HTTP头部的USER_AGENT(user_agent的内容包含发出请求的用户信息)
REMOTE_ADDR::返回http头部IP地址
接下来我们再来看看这些源代码 到底哪里可以让我们注入img找到了一个insert语句 这里发现 后面有个引号,要是我们在里面输入我们的命令,是不是就可以获得我们需要的信息了?那我们该如何更改呢——burp suit 抓包工具,因为 我们从前面的$servent可以看出 这里是需要返回http头部的信息,所以。。。。懂的都懂
试一下:

img

猜猜我发现了啥,这有个user_agent,OK 让我们吧大致思路理顺一下:一开始我们需要返回http发出请求的用户信息,如果我们将这个用户信息更改完我们的指令,那其实就是这样的
$uagent=$servent[‘这里就是我们的注入语句’]
然后这个查询语句会被代入到sql中执行,我们尝试一下
将user-Agent替换成以下语句
现在user-Agent这个语句的最后添加一个单引号,看看是否报错
结果是会报错的,所以我们可以直接在burp suit里面添加我们的注入语句img

1
'or extractvalue(1,concat('~',database(),'~')),1,1) # 

这里说说我的思路:因为我们前面知道,这个注入点是在insert语句当中的,我一开始没输入后面的,1,1导致出现错误提示:就是和insert前面插入值不对应的情况,他insert插入了三个值,所以我们这里也需要有三个值 然后#号注释掉后面的内容,然后至于后面的1加不加引号都无所谓,因为1无论加不加引号都是合法数据,但是 如果要加引号 一定要严格按照insert语句的格式 比如1 左右两边就要加 不然就会报错:

1
2
'or extractvalue(1,concat('~',database(),'~')),'1','1') # 
'or extractvalue(1,concat('~',(select table_name from information_schema.tables where table_schema='security' limit 0,1),'~')),1,1) #

接下来就是爆表 爆字符段了
让我们愉快的进入19关
这关和18关差不多就是注入的位置现在在Referer

第20关

这里我们先看看源码吧img
依旧做了过滤操作,所以不能在账号密码这里操作
我们发现他和前几关不一样的时候这里又获取了一个cookie数据
img

什么是cookie?
Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息
cookie是什么?有什么作用?
cookies的作用主要是,当你访问了某些网页,并且对网页的一些设置进行修改,cookies就能跟踪并记录到这些修改,当你下一次访问这个网页的时候,这个网页会分析你电脑上的cookies,进而采取措施像你返回更符合你个性化的网页;
而且,你自动保存的内容也是被记录在cookie当中的,当然,目前大部分广告的定位基础也是基于cookies的,比如你此前访问了大量的健身类网站,cookies记录了你的访问行为,广告主就能够根据你的访问行为,向你推送健身类的广告

感觉这个就有点危险呀,好像可以利用cookies做点什么不得了的东西???

我们继续往下看img

有点熟悉,我们好像可以利用这个cookee试试,这个时候我们依旧使用burp suit抓个包img

第一次没看到cookie的数据 我们再点一次forwardimg

这一次就有了 接下来让我们试试加个引号img

出现了报错,然后我们再试试and 1=1 和and 1=2

不一样,报错了 ,所以这里存在注入点 接下来就是常规操作了 我们应该是要利用报错注入img
成功 代码是

1
' and extractvalue(1,concat('~',database(),'~')) #

这里 我就在想为什么我要要按两次forward才能截取到含有cooKies的包呢?
让我们回去看看源代码
学到这里 有必要先总结一下几个常见函数,之前只是模模糊糊的概念:
1.mysqli_query() 函数执行某个针对数据库的查询。
2.mysqli_fetch_array() 函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有。(取出我们输入的那一行账号密码)
3.setcookie() 函数向客户端发送一个 HTTP cookie。cookie 是由服务器发送到浏览器的变量。cookie 通常是服务器嵌入到用户计算机中的小文本文件。每当计算机通过浏览器请求一个页面,就会发送这个 cookie。cookie 的名称指定为相同名称的变量。例如,如果被发送的 cookie 名为 “name”,会自动创建名为 $user 的变量,包含 cookie 的值。必须在任何其他输出发送前对 cookie 进行赋值。如果成功,则该函数返回 true,否则返回 false。

1
setcookie(name,value,expire,path,domain,secure)
img

header()跳转函数
header(“Location:”)作为php的转向语句,接下来就跳转打开新页面,并且如果后面没有紧跟exit的话 他是会继续执行的只不过不会返回到页面上,要求header前没有任何输出。
这就是为什么我们要连续按两次forward的原因了。
接下来的语句好像也没啥
其实在这一关中还可以使用union拼接select语句img
从这个途中我们不难发现 其实username password都是从cookee中获取的,然后我们之前也知道cookee那里存在注入点想要让我们需要的数据直接在username和paswrd这里输出,接下来我们就可以order by 然后 union select 拼接语句查询了,思路就跟之前的一样。

第21关

不知道为啥我21关和22关是没有的但是我看了一下题目,是上传文件的题目 然后查了一下 果然还是要一句话木马,然后需要利用burp suit

Author

vague huang

Posted on

2020-11-20

Updated on

2020-12-08

Licensed under

Comments