任务七:Web学习
内容:
1.查阅资料,掌握PHP类的一句话木马的基本形式与原理,并学会图片木马的简单制作(图片中嵌入一句话;一句话封装成假图片)
2.下载配置蚁剑(https://github.com/AntSwordProject/AntSword/)熟悉应用界面,完成 BUUCTF [极客大挑战 2019 Knife]
3.下载并配置 upload-labs(https://github.com/c0ny1/upload-labs/)
4.可以做一下 极客大挑战 2019 的 [HaveFun] [BuyFlag] [HTTP] 回顾一下前面学过的内容
5.查询SQL注入的基本原理与注入步骤;学习并掌握SQL联合查询注入(union select)的基本原理与方法,可以判断是什么类型的注入,学会fuzz测试,完成sqli-labs的1-4(可以借用hackbar的SQLI模块),做完后看一下各关卡的源码,看一下后台代码是怎样实现查询的,基本语句是什么
6.根据上一个任务的源码,查询万能登陆密码的原理,完成 [极客大挑战 2019 EasySQL]
一句话木马
一句话木马的基本原理即植入并利用PHP语言中所提供的的可以运行PHP语句类型字符串或者shell指令的函数。
常在前面加“@”以隐蔽其运行所带来的报错结果。增加运行的隐蔽性。
常见的也就是之前学习过的几种:eval(),assert(),
preg_replace()[https://blog.csdn.net/qq_33020901/article/details/78951543],call_user_func()[将第一个参数当做回调函数使用,其他参数是提供给第一个callback参数的],shell_.exec(),system(),exec(),passthru()这一类。
一句话木马的绕过
但是,由于WAF(Web Application Firewall)检测的存在,会对代码和传递的参数进行关键词检测,来规避对一句话木马的利用。
因此才实际的操作中,一句话木马会衍生出无数的变形,以绕过WAF的检查。
再说变形之前,先看看如何挂马。
挂马即主动将包含PHP一句话的文件上传服务器或者将代码上传至mysql数据库中。
可以SELECT 木马代码 INTO 数据表。
一句话木马的变形
为了绕过WAF对木马的检测。需要对一句话木马进行适当变形以避开关键词检测。
只能说变形确实多种多样。主要是基于各种编码和冷门函数。
先贴上两个大佬的博客
https://www.cnblogs.com/white-album2/p/9851468.html
https://my.oschina.net/programs/blog/1649544
图片木马的简单制作方式
最简单的,可以用copy方式,在同一文件夹中,
copy 图片名/b + 木马文件名/a 目标文件名
的方式来制作。
蚁剑配置
蚁剑配置不算难,但直到我做完下面的题才反应过来蚁剑是SHELL管理工具这句话的意思。(菜鸡发抖)
PS:看到有大佬修改文件来修改user-agent的,之后尝试,暂且留着。
极客大挑战 2019 Knife
刚进入界面看到如下:
看到这一句话还傻乎乎的以为只要Post Syc=…就可以执行命令了。。。
但现实还是打脸。。。不管我执行什么命令都毫无反应。。。。
查看了大佬的文章,才反应过来是要用蚁剑(菜刀)连接就行emmmmm…这就是强者的世界吗?
连接后看到flag。
这就是“白给”的含义吗?
复习题
这几道题目难度不大。
唯一掉的坑是忘了Hackbar Post数据的用法(呃…)
在BuyFlag那里卡了好久。。。
解决完这个问题后,发现自己不管输入的数据多长都不对。
盲猜一波绕过。但并不清楚具体是什么漏洞。
既然是复习题,那应该是我学过的。
数组传递试了一下。
完成。
做完之后还是对到底是什么漏洞感到好奇,看大佬文章才知道是strcmp漏洞。emmm…
(2020.09.02 19:51 补充
有关strcmp的一个知识点:strcmp(a,b),如果a<b返回负数,如果a>b返回正数,如果a=b返回0。
但是!如果a,b的类型不匹配,它会报错返回0,这就很致命了,明明数据类型不匹配但是判定相等了,所以我们只要把money以数组的形式上传就好了。money[]=a,也能出现flag。(https://www.freesion.com/article/7548535583/)
另外,像这种POST数据的,也可以直接在网上找一个http接入测试模拟网页来运行。
呜呜呜,我真是很久没有正经学过了。 )
SQL注入初步学习
SQL基本原理
简单来说,SQL注入即通过在数据库查询命令中写入恶意查询代码,从而可以从数据库中进行各种查询和操作。
基本流程大概是这样:
①通过检查Web页而上存在的SQL注入漏洞,构建特殊的SQL注入点;
②其次通过这些特殊的注入点利用Web页而动态传递参数的功能,将SQL的语法组合动态传递给数据库;
③然后根据数据库的不同类型,对数据库采取不同的处理;
④最后执行SQL语句,从而达到攻击者想要的目的。
SQL注入注入步骤
1)寻找注入点
2)初步构造语句,判断注入点类型
注入点类型分两种,数字类型和字符类型。
数字类型注入点一般不需要引号括住,直接输入即可,而字符类型输入需要引号括住
数字型注入
当输入的参数为整形时,如果存在注入漏洞,可以认为是数字型注入。
测试步骤:
(1) 加单引号,URL:www.text.com/text.php?id=3’
对应的sql:select * from table where id=3’ 这时sql语句出错,程序无法正常从数据库中查询出数据,就会抛出异常;
(2) 加and 1=1 ,URL:www.text.com/text.php?id=3 and 1=1
对应的sql:select * from table where id=3’ and 1=1 语句执行正常,与原始页面如任何差异;
(3) 加and 1=2,URL:www.text.com/text.php?id=3 and 1=2
对应的sql:select * from table where id=3 and 1=2 语句可以正常执行,但是无法查询出结果,所以返回数据与原始网页存在差异
如果满足以上三点,则可以判断该URL存在数字型注入。
字符型注入
测试步骤:
(1) 加单引号:select * from table where name=’admin’’
由于加单引号后变成三个单引号,则无法执行,程序会报错;
(2) 加 ’and 1=1 此时sql 语句为:select * from table where name=’admin’ and 1=1’ ,也无法进行注入,还需要通过注释符号将其绕过;
Mysql 有三种常用注释符:
– 注意,这种注释符后边有一个空格
#通过#进行注释
/* */ 注释掉符号内的内容
因此,构造语句为:select * from table where name =’admin’ and 1=1—’ 可成功执行返回结果正确;
(3) 加and 1=2— 此时sql语句为:select * from table where name=’admin’ and 1=2 –’则会报错
如果满足以上三点,可以判断该url为字符型注入。
SQL联合查询注入
联合查询注入利用的前提:页面上有显示位。
联合注入的过程
1、判断注入点
2、判断是整型还是字符型
3、判断查询列数
4、判断显示位
5、获取所有数据库名
6、获取数据库所有表名
7、获取字段名
8、获取字段中的数据
SQL注入常用payload类型
Mysql 5.x 的数据结构中,默认定义了information_schema数据库,用于存储数据库元信息,包括schemata(存储数据库名),tables(存储数据库名和表名)和columns(存储数据库名,表名和列名)三张表。
常用SQL查询语句
查询:SELECT 列名(*)FROM 表名 WHERE 字段1 = ‘条件1’AND 字段2 = ‘条件2’
插入:INSERT INTO table name (列1,列2……)VALUES (值1,值2……)
更改:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名 = 某值
删除:DELETE FROM 表名 WHERE 列名 = 值
常用的查询函数
user() :查看当前mysql登录用户名
database() :查看当前使用的mysql数据库名
version():查看当前mysql版本
limit:limit m n 从m行开始,到m+n行结束
注释:
#,–空格,/* */
内联注释/**/只有mysql可以识别,常用于绕过WAF
where id=1/*union*/ /* select*/ 1,2,3,4
空格可以用%20代替以防被浏览器吞掉。
SQLI-LIBS LESS 1–4
总体难度不大,less1是字符型注入,less2是1数值型注入,less3是(’’)闭合的字符型注入,less4是("")闭合的字符型注入。
FUZZ测试
fuzz测试即通过构造发送大量的测试包来对系统安全性进行测试。
可是使用SPIKE fuzz工具。具体使用见
https://blog.csdn.net/yalecaltech/article/details/90575167
万能登录密码
SQL万能登录密码的原理即通过构造payload使SQL语句闭合,将后面的内容注释掉。
一般SQL查询语句结构为:
select name,pass from tbAdmin where name='id' and pass='passwd'
输入用户名:’ or 1='1
SQL变成下面这个样子:
select name,pass from tbAdmin where name='' or 1='1' and pass='passwd'
1=为真,故验证通过。
BUUCTF [极客大挑战 2019 Knife]
直接在用户名输入框输入’ or 1='1回车即可得到flag。