Skip to content

Instantly share code, notes, and snippets.

@vrthra
Last active May 27, 2019 16:05
Show Gist options
  • Select an option

  • Save vrthra/72cfafff238057a833ac13e12c37fe01 to your computer and use it in GitHub Desktop.

Select an option

Save vrthra/72cfafff238057a833ac13e12c37fe01 to your computer and use it in GitHub Desktop.
import string
import tinycss
import fuzzingbook
from fuzzingbook import GrammarFuzzer
import string
CSS_GRAMMAR = {
'<start>': ['<stylesheet>'],
'<stylesheet>': ['<[CHARSET_SYM_STRING_SEMI]>? <[S_OR_CDO_OR_CDC]>* <[import_CDO_S_OR_CDC_S]>* <[stylesheet_closing_GROUPING]>*'],
'<[CHARSET_SYM_STRING_SEMI]>': ['<CHARSET_SYM> <STRING> ;'],
'<[S_OR_CDO_OR_CDC]>': ['<Sp>', '<CDO>', '<CDC>'],
'<[import_CDO_S_OR_CDC_S]>': ['<import> <[CDO_S_OR_CDC_S]>*'],
'<[CDO_S_OR_CDC_S]>': ['<CDO> <Ss>', '<CDC> <Ss>'],
'<[ruleset_OR_media_OR_page]>': ['<ruleset>', '<media>', '<page>'],
'<[stylesheet_closing_GROUPING]>': ['<[ruleset_OR_media_OR_page]> <[CDO_S_OR_CDC_S]>*'],
'<import>': ['<IMPORT_SYM> <Ss> <[STRING_OR_URI]> <Ss> <media_list>? ; <Ss>'],
'<[STRING_OR_URI]>': ['<STRING>', '<URI>'],
'<media>': ['<MEDIA_SYM> <Ss> <media_list> { <Ss> <ruleset>* } <Ss>'],
'<media_list>': ['<medium> <[COMMA_S_medium]>*'],
'<[COMMA_S_medium]>': [', <Ss> <medium>'],
'<medium>': ['<IDENT> <Ss>'],
'<page>': ['<PAGE_SYM> <Ss> <pseudo_page>? { <Ss> <declaration>? <[SEMI_S_declaration]>* } <Ss>'],
'<[SEMI_S_declaration]>': ['; <Ss> <declaration>?'],
'<pseudo_page>': [': <IDENT> <Ss>'],
'<operator>': ['/ <Ss>', ', <Ss>'],
'<combinator>': ['+ <Ss>', '> <Ss>'],
'<unary_operator>': ['-', '+'],
'<property>': ['<IDENT> <Ss>'],
'<ruleset>': ['<selector> <COMMA_S_selector>* { <Ss> <declaration>? <[SEMI_S_declaration]>* } <Ss>'],
'<COMMA_S_selector>': [', <Ss> selector'],
'<selector>': ['<simple_selector> <[combinator_selector_OR_S]>?'],
'<[combinator_selector]>': ['<combinator>? <selector>'],
'<[combinator_selector_OR_S]>': ['<combinator> <selector>',
'<Sp> <[combinator_selector]>?'],
'<simple_selector>': ['<element_name> <[HASH_OR_class_OR_attrib_OR_pseudo]>*',
'<[HASH_OR_class_OR_attrib_OR_pseudo]>+'],
'<[HASH_OR_class_OR_attrib_OR_pseudo]>': ['<HASH>', '<class>',
'<attrib>', '<pseudo>'],
'<class>': ['.<IDENT>'],
'<element_name>': ['<IDENT>', '*'],
'<attrib>': ['[ <Ss> <IDENT> <Ss> <[attrib_GROUPING]>? ]'],
'<[EQUAL_OR_INCLUDES_OR_DASHMATCH]>': ['=', '<INCLUDES>', '<DASHMATCH>'],
'<[IDENT_OR_STRING]>': ['<IDENT>', '<STRING>'],
'<[attrib_GROUPING]>': ['<[EQUAL_OR_INCLUDES_OR_DASHMATCH]> <Ss> <[IDENT_OR_STRING]> <Ss>'],
'<pseudo>': [': <[IDENT_OR_FUNCTION]>'],
'<[IDENT_OR_FUNCTION]>': ['<IDENT>',
'<FUNCTION> <Ss> <[IDENT_S]>? )'],
'<[IDENT_S]>': ['<IDENT> <Ss>'],
'<declaration>': ['<property> : <Ss> <expr> <prio>?'],
'<prio>': ['<IMPORT_SYM> <Ss>'],
'<expr>': ['<term> <[operator_term]>*'],
'<[operator_term]>': ['<operator>? <term>'],
'<term>': ['<unary_operator>? <[term_GROUPING]>',
'<STRING> <Ss>', '<IDENT> <Ss>', '<URI> <Ss>',
'<hexcolor>', '<function>'],
'<[term_GROUPING]>': ['<NUMBER> <Ss>', '<PERCENTAGE> <Ss>',
'<LENGTH> <Ss>', '<EMS> <Ss>',
'<EXS> <Ss>', '<ANGLE> <Ss>',
'<TIME> <Ss>', '<FREQ> <Ss>'],
'<function>': ['<FUNCTION> <Ss> <expr> ) <Ss>'],
'<hexcolor>': ['#<[three_char_HEX]> <Ss>', '#<[six_char_HEX]> <Ss>'],
'<[three_char_HEX]>': ['<HEX_CHAR><HEX_CHAR><HEX_CHAR>'],
'<[six_char_HEX]>': ['<HEX_CHAR><HEX_CHAR><HEX_CHAR><HEX_CHAR><HEX_CHAR><HEX_CHAR>'],
'<HEX_CHAR>': ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f'],
'<Sp>': ['<WHITESPACE>+'],
'<Ss>': ['<WHITESPACE>*'],
'<So>': ['', '<WHITESPACE>'],
'<CDO>': ['<!--'],
'<CDC>': ['-->'],
'<INCLUDES>': ['~='],
'<DASHMATCH>': ['|='],
'<STRING>': ['<string1>', '<string2>'],
'<IDENT>': ['<{ident}>'],
'<HASH>': ['#<{name}>'],
'<IMPORT_SYM>': ['@import'],
'<PAGE_SYM>': ['@page'],
'<MEDIA_SYM>': ['@media'],
'<CHARSET_SYM>': ['@charset'],
'<EMS>': ['<{num}>em'],
'<EXS>': ['<{num}>ex'],
'<LENGTH>': ['<{num}>px', '<{num}>cm', '<{num}>mm',
'<{num}>in', '<{num}>pt', '<{num}>pc'],
'<ANGLE>': ['<{num}>deg', '<{num}>rad', '<{num}>grad'],
'<TIME>': ['<{num}>ms', '<{num}>s'],
'<FREQ>': ['<{num}>hz', '<{num}>khz'],
'<PERCENTAGE>': ['<{num}>%'],
'<NUMBER>': ['<{num}>'],
'<URI>': [
'url("<So><url><So>")',
'url("<So><STRING><So>")',
],
'<url>': ['<url_>*'],
'<url_>': list("!#$%&*-~") + ['<escape>'],
'<FUNCTION>': ['<{ident}>('],
'<string1>': ['"<qmychars1>*"'],
'<string2>': ["'<qmychars2>*'"],
'<qnonl1>': list(set(string.printable) - set('\n\r\f"')),
'<qnonl2>': list(set(string.printable) - set('\n\r\f\'')),
'<qmychars1>': ['<qnonl1>','\<nl>','<escape>'],
'<qmychars2>': ['<qnonl2>','\<nl>','<escape>'],
'<nl>': ['\r', '\n', '\f', '\r\n'],
'<escape>': [
#'<unicode>', # TODO
'\<echar>'],
'<echar>': list(set(string.printable) - set('\r\n\f0123456789abcdef')),
'<{ident}>': ['<minus>?<nmstart><nmchar>*'],
'<nmstart>': list(string.ascii_lowercase) + ['<escape>', '_'],
'<nmchar>': list(string.ascii_lowercase + string.digits) + ['<escape>', '_', '-'],
'<minus>': ['-'],
'<{name}>': ['<nmchar>+'],
'<{num}>': ['<INTEGER>'],
'<WHITESPACE>': [' ', '\t'], #list(string.whitespace),
'<INTEGER>': ['<DIGIT><INTEGER>', '<DIGIT>'],
'<DIGIT>': ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
}
GrammarFuzzer.is_valid_grammar(CSS_GRAMMAR)
from io import StringIO
parser = tinycss.make_parser('page3')
gf = GrammarFuzzer.GrammarFuzzer(GrammarFuzzer.convert_ebnf_grammar(CSS_GRAMMAR), min_nonterminals=100)
Max = 1000
count = 0
for i in range(Max):
p = gf.fuzz()
with open('_.css', 'w+') as f:
print(p, file=f)
try:
print(parser.parse_stylesheet(p))
print('+', repr(p))
print(p)
count += 1
except:
print('-', repr(p))
print(count, Max)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment